浅谈java 中static关键字。

首先两个常识:

在Java中public class中的public static void main(String [] args){}这个方法是程序执行的入口;

一般情况下类中的方法调用是和类的实例有一种依赖关系,而且方法一般是不能独立于类实例二存在的。


所以很多情况下我们都会new出一个类的实例对象,然后通过这个实例对象来调用我们需要用到的方法。但是在很多情况下,我们会希望这样的情况:

(1)不管我们创建多少个实例对象,我们希望这个类中的某些代码始终只有一部分。

(2)我们希望某些方法可以不依赖于类的实例,我们不通过创建实例对象也能完成对这个方法的调用。

对于这两个情况,我们看下面的代码:

public class StaticTest {
	public static void main(String [] args)
	{
		//对于Class2,分别创建两个实例对象
		Class2 cs21 = new Class2();
		Class2 cs22 = new Class2();
		//分别对类中的属性count进行重新赋值
		cs21.count2 = 2;
		cs22.count2 = 3;
		//通过输出我们可以看到,两是实体对象中的值不一样
		System.out.println(cs21.count2);
		System.out.println(cs22.count2);
		//调用其中的方法
		cs21.show();
		cs22.show();
		
		//直接使用类中的方法
		Class3.show();
		//创建两个Class3的实例对象
		Class3 cs31 = new Class3();
		Class3 cs32 = new Class3();
		//对其中的属性值重新赋值
		cs31.count3 = 2;
		cs32.count3 = 3;
		//输出值,看比较。
		System.out.println(cs31.count3);
		System.out.println(cs32.count3);
	}
}

class Class2{
	public int count2 = 1;
	public void show()
	{
		System.out.println("just a common function of Class2.");
	}
}

class Class3{
	public static int count3 = 1;
	public static void show()
	{
		System.out.println("just a common function of Class3.");
	}
}
对上面代码进行分析,对于Class2这个类而言,我们想使用它里面的属性或者方法,都必须创建这个类的实例,否则是不能调用的,而且两个实例对象中的属性和方法相互独立,互不干扰,也就是说我们创建几个实例对象,这个类中的属性和方法就有几份。而对于Class3这个类而言,我们不需要创建这个类的实例就可以直接访问它里面的属性和方法,通过类名.属性或者类名.方法这样的形式,同事我们创建了两个实例对象,对里面的属性值修改后发现两个实例对象中的属性值是一样的,这说明在有了static修饰之后,不管创建多少个实例对象,里面static修饰的变量或者方法都只有一份。

然后我们再看下面的例子:

public class StaticTest {
	public static void main(String [] args)
	{
		//第一次创建实例
		InitOrderSun ios1 = new InitOrderSun();
		//第二次创建实例
		InitOrderSun ios2 = new InitOrderSun();
		
	}
}

class InitOrder{
	InitOrder()
	{
		System.out.println("父类构造器中的可执行语句。");
	}
	public static void put()
	{
		System.out.println("父类静态方法中的可执行语句。");
	}
	static
	{
		System.out.println("父类类中的静态代码块。");
	}
	{
	    System.out.println("父类类中的非静态代码块。");
	}
}

class InitOrderSun extends InitOrder{
	InitOrderSun()
	{
		System.out.println("子类中构造器中的可执行语句。");
	}
	public static void putSun()
	{
		System.out.println("子类静态方法中的可执行语句。");
	}
	static
	{
		System.out.println("子类中的静态代码块。");
	}
	{
	    System.out.println("子类中的非静态代码块。");
	}
}

通过对上面的代码的执行分析后,我们可以知道:在一个类的实例创建中,static修饰的代码块是先于其他的代码块最先执行的,而且不管创建多少个实例对象,静态代码块的初始化只有一次。

通过总结,我们可以知道static的作用有如下几点:

(1)在没有任何实例对象的前提下,仅仅通过类本身就可以调用static方法;

(2)不管创建多少个实例对象,static修饰的属性和方法只有一份;

(3)创建类的对象的时候,初始化的顺序——static是最先被初始化的;

(4)不管创建多少个对象,static代码块只初始化一次。

猜你喜欢

转载自blog.csdn.net/OASsai/article/details/52389743