面向对象基础——static关键字和代码块的使用

具体内容

在Java中可以使用static声明属性和方法,因为之前多部分属性和方法都属于非static的,这样一来,每个对象都占有自己的内容,如果现在希望一个属性被所有的对象所共同拥有,则可以将其声明为static类型,声明为static类型的属性和方法之后此属性或方法也称为类非,可以由类名称直接调用。

使用static声明属性

static可以声明全局属性,全局属性到底有哪些作用?如下所示

class Person{	// 定义Person类
	String name ;		// 定义name属性,暂时不封装
	int age ;			// 定义age属性,暂时不封装
	String country = "A城" ;	// 定义城市属性,有默认值
	public Person(String name,int age){
		this.name = name ;
		this.age = age;
	}
	public void info(){	// 得到信息
		System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
	}
};
public class StaticDemo01{
	public static void main(String args[]){
		Person p1 = new Person("张三",30) ;	 // 实例化对象
		Person p2 = new Person("李四",31) ;	 // 实例化对象
		Person p3 = new Person("王五",32) ;	 // 实例化对象

		p1.info() ;
		p2.info() ;
		p3.info() ;
	}
};

以上代码虽然实现了一些基本功能,但是如果此时城市的名称不叫A城, 而改成了B城,如果现在已经产生了5000个对象,name意味着,此时需要修改5000个对象的country属性,所以此时最好使用static关键字进行声明。

使用this修改程式属性

class Person{	// 定义Person类
	String name ;		// 定义name属性,暂时不封装
	int age ;			// 定义age属性,暂时不封装
	static String country = "A城" ;	// 定义城市属性,有默认值,static
	public Person(String name,int age){
		this.name = name ;
		this.age = age;
	}
	public void info(){	// 得到信息
		System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
	}
};
public class StaticDemo02{
	public static void main(String args[]){
		Person p1 = new Person("张三",30) ;	 // 实例化对象
		Person p2 = new Person("李四",31) ;	 // 实例化对象
		Person p3 = new Person("王五",32) ;	 // 实例化对象
		System.out.println("--------------- 修改之前 -------------") ;
		p1.info() ;
		p2.info() ;
		p3.info() ;
		p1.country = "B城" ;		// 修改static属性
		System.out.println("--------------- 修改之后 -------------") ;
		p1.info() ;
		p2.info() ;
		p3.info() ;
	}
};

修改一个对象的country属性,则其他对象的country属性都会跟着改变。因为country是该类中所有对象共享的变量。

每一个对象都拥有各自的堆栈空间,堆内存空间中保存每一个对象的各自的属性,但是所有的static属性是保存在了全局数据区中,所有对象指向全局数据区中的一个内容,所以当一个对象修改之后,所有对象的内容将全部变化。

java中有以下内存区域:

栈内存:可以保存对象的名称(保存,访问的堆内存的地址)

堆内存:保存每个对象的具体属性。

全局数据区:保存static类型的属性

全局代码区:保存所有方法的定义。

一般在调用static属性的时候最好使用类名直接调用,采用“类名.属性”的形式调用。Person.country = "B城";

不但可以直接使用static声明属性,也可以使用static声明方法。

使用static声明方法

如果一个方法使用了static关键字进行了声明,则此方法可以直接使用类名称进行调用,下面将之前全部代码中的属性进行了封装。

class Person{	// 定义Person类
	private String name ;		// 定义name属性,暂时不封装
	private int age ;			// 定义age属性,暂时不封装
	private static String country = "A城" ;	// 定义城市属性,有默认值,static
	public static void setCountry(String c){ // 此方法可以直接由类名称调用
		country = c ;
	}
	public static String getCountry(){
		return country ;
	}
	public Person(String name,int age){
		this.name = name ;
		this.age = age;
	}
	public void info(){	// 得到信息
		System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
	}
};
public class StaticDemo04{
	public static void main(String args[]){
		Person p1 = new Person("张三",30) ;	 // 实例化对象
		Person p2 = new Person("李四",31) ;	 // 实例化对象
		Person p3 = new Person("王五",32) ;	 // 实例化对象
		System.out.println("--------------- 修改之前 -------------") ;
		p1.info() ;
		p2.info() ;
		p3.info() ;
		Person.setCountry("B城") ;		// 调用静态方法修改static属性的内容
		System.out.println("--------------- 修改之后 -------------") ;
		p1.info() ;
		p2.info() ;
		p3.info() ;
	}
};

注意:使用static方法不能调用非static的属性或方法。

例如以下代码就是错误的:

class Person{	// 定义Person类
	private static String country = "A城" ;	 // 定义静态属性
	private String name = "Hello" ;
	public static void sFun(String c){
		System.out.println("name = " + name) ;	// 错误,不能调用非static属性
		fun() ;									// 错误,不能调用非static方法
	}
	public void fun(){
		System.out.println("World") ;
	}
};

因为static的属性或方法可以在对象没有实例化的时候就直接可以进行调用了,而非static属性必须在对象实例化之后才可以调用。

static应用一:统计一个类到底产生了多少个对象。

class Demo{	// 定义Person类
	private static int count = 0 ;	// 所有对象共享此属性
	public Demo(){
		count++ ;					 // 只要有对象产生就应该自增
		System.out.println("产生了" + count + "个对象!") ;
	}
};
public class StaticDemo06{
	public static void main(String args[]){
		new Demo() ;			// 增加新对象
		new Demo() ;			// 增加新对象
		new Demo() ;			// 增加新对象
	}
};

static应用实例二:可以使用static对对象进行自动的编名操作

class Demo{	// 定义Person类
	private String name ;			// 保存名字
	private static int count = 0 ;	// 所有对象共享此属性
	public Demo(){
		count++ ;					// 有对象产生就自增
		this.name = "DEMO-" + count ;	// 自动进行编名操作
	}
	public Demo(String name){
		this.name = name;			// 可以通过构造赋值
	}
	public String getName(){		// 取得姓名
		return this.name ;
	}
};
public class StaticDemo07{
	public static void main(String args[]){
		System.out.println(new Demo().getName()) ;
		System.out.println(new Demo("LXH").getName()) ;
		System.out.println(new Demo().getName()) ;
		System.out.println(new Demo("MLDN").getName()) ;
		System.out.println(new Demo().getName()) ;
	}
};

static的使用总结:

使用static声明的属性或方法可以直接由类名调用。

使用static方法的时候一定要注意,只能访问static声明的属性或方法,而非static声明的属性和方法是不能访问的,因为static可以在对象没有实例化时就直接调用,而其他的属性必须在对象实例化之后才能调用。

代码块

代码块是指使用{}括起来的一段代码,根据位置的不同可以分为四种:普通代码块、构造块、静态代码块、同步代码块,其中同步代码块涉及多线程。

普通代码块:直接定义在方法中的代码块称为普通代码块。

public class CodeDemo01{
	public static void main(String args[]){
		{		// 普通代码块
			int x = 30 ;	// 就属于一个局部变量
			System.out.println("普通代码块 --> x = " + x) ;
		}
		int x = 100 ;		// 与局部变量名称相同
		System.out.println("代码块之外 --> x = " + x) ;
	}
};

构造块:将代码块直接定义在类中,则称为构造块。

class Demo{
	{	// 直接在类中编写代码块,称为构造块
		System.out.println("1、构造块。") ;
	}
	public Demo(){	// 定义构造方法
		System.out.println("2、构造方法。") ;
	}
};
public class CodeDemo02{
	public static void main(String args[]){
		new Demo() ;		// 实例化对象
		new Demo() ;		// 实例化对象
		new Demo() ;		// 实例化对象
	}
};

构造块优先于构造方法执行,且执行多次。。只要一有实例对象产生,就会执行构造快的内容。

静态代码块:直接使用static关键字声明的代码块称为静态代码块。

class Demo{
	{	// 直接在类中编写代码块,称为构造块
		System.out.println("1、构造块。") ;
	}
	static{	// 使用static,称为静态代码块
		System.out.println("0、静态代码块") ;
	}
	public Demo(){	// 定义构造方法
		System.out.println("2、构造方法。") ;
	}
};
public class CodeDemo03{
	static{		// 在主方法所在的类中定义静态块
		System.out.println("在主方法所在类中定义的代码块") ;
	}
	public static void main(String args[]){
		new Demo() ;		// 实例化对象
		new Demo() ;		// 实例化对象
		new Demo() ;		// 实例化对象
	}
};

静态块优先于主方法执行,如果在普通类中定义的静态块优先于构造块执行,不管有多少个实例化对象产生,静态代码块只执行一次,静态代码块的主要功能就是为静态属性初始化。

例如:不使用主方法就能达到执行某些操作的功能。

public class CodeDemo04{
	static{
		System.out.println("Hello World!!!") ;
		System.exit(1) ;	// 程序退出
	}
};

时间: 2024-09-30 20:16:50

面向对象基础——static关键字和代码块的使用的相关文章

Java中this和static关键字及代码块

this: 可以使用this表示类中的属性------this.name=name 可以使用this强调调用的是本类的方法 可以使用this调用本类的构造方法------this();调用本类中无参构造方法 可以使用this表示当前对象(调用方法的对象)----最重要的用途 static: 声明属性---------属性则为全局变量 声明方法---------Person.setName("Tom");使用类名称调用static方法 普通代码块:直接在方法或是语句中定义的代码块 pub

static关键字&&静态代码块

1.静态代码块:在类加载的时候运行,不能访问普通变量,不能存在任何方法体中: (2)静态方法:类初始化的时候加载 (3)静态变量:类初始化的时候加载2.构造代码块: (1)每次创建对象的时候都会提前调用一次构造代码块 (2)构造代码块不是优先于构造函数执行,而是依托于构造函数 对象的初始化顺序: 首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容, 当子类的静态内容执行完毕之后,再去看父类有没有构造代码块,如果有就执行父类的构造代码块, 父类的构造代码块执行完毕,接着执

java学习--基础知识进阶第一天--static静态关键字、代码块

今日内容介绍 u 知识回顾 u static静态关键字 u 代码块 第1章 知识回顾 1.1 方法的回顾 1.1.1 案例代码一: package com.itheima_01; /* * 需求:定义一个方法求两个数的和,并在主方法中调用 * * 方法:类中的一段具有特定功能的程序,提高了代码的复用性和可维护性 * 定义格式: * public static 返回值类型(没有返回值写void) 方法名(参数类型 参数名,参数类型 参数名2) {//形参 * 方法体; * } * 调用方式: *

java基础—static关键字

一.static关键字 原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态成员变量.对于static成员变量来说,这个成员变量只有一份,而且这一份是这个类所有的对象共享. 1.1.静态成员变量与非静态成员变量的区别 以下面的例子为例说明 1 package cn.galc.test; 2 3 public class Cat { 4 5 /** 6 * 静态成员变量 7 */ 8 private static int sid = 0; 9 10

java多线程(五)synchronized关键字修饰代码块

转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47916703 在上一篇博客中我们介绍了synchronized关键字修饰方法的用法,我们接着介绍synchronized关键字.除了修饰方法之外,还可以修饰代码块,一共有以下5种用法. 一.this synchronized(this){ //互斥代码 } 这里的this指的是执行这段代码的对象,synchronized得到的锁就是this这个对象的锁,这种写法等价于我们上一篇博

二、Java面向对象(10)_代码块

2018-05-02 代码块 什么是代码块? 在类或者方法中,使用"{}"将多行代码封装在一起,形成一个独立的代码区,这就构成了代码块. 在代码块里的变量属于局部变量,只在自己所在区域的前后{}内有效. 代码块的分类 根据代码块定义的位置不同,分成三种 1.局部代码块:在方法里用一对"{}"括起来的数据,就是局部代码块, 一般我们不会直接使用局部代码块,只不过我们会结合if,while,for,try等关键字联合,表示一块代码区域. 2.初始化代码块(构造代码块):

Java static变量与代码块

static是用来修饰成员变量和成员方法,也可以形成静态static代码块. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 它方便了在没有创建对象的情况下使用,如math类的使用,main方法的使用. 特点: package com.company; /* case_01被所有

Java基础-static 关键字解析

参考文章: https://www.cnblogs.com/dolphin0520/p/3799052.html static的应用: 1.static是为了在没有创建任何对象的前提下,仅仅通过类本身来调用static方法. 只要类被加载了,就能通过类名进行访问. 2.static 可以用来修饰类的成员方法,类的成员变量 静态方法是不可以调用非静态方法,但是非静态方法能够调用静态方法, 因为静态方法是在类中的,而非静态方法必须要以来具体的对象才能被调用 static变量: 称为静态变量,静态变量

Java基础(9) - 静态、代码块

关键字加载顺序 .类初始化 .方法区.进程 存在作用:变量 -> 全局共享 (跨线程,但不支持跨进程)方法 -> 不用类实例就能直接使用,避免New的消耗.(为什么静态方法不能访问非静态变量)代码块 -> 静态块在类初始化就运行 ,初始化顺序 静态代码块 -> 普通代码块 -> 构造方法 -> 普通方法,代码块只会初始化一次导包 -> 静态导包,将类的方法直接导入到当前类中,从而直接使用"方法名"即可调用类方法,更加方便. 类加载:? 静态属性