第10天 Java static关键字



一、static关键字

被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
static字段对每个类来说只有一个存储空间,而非static字段则对每个对象有一个存储空间

二、static分三部分:

static变量
static方法
static块


三、static变量作用:

引用时可以无需创建对象
全局变量,针对所有对象仅有一个,且相互共享
不创建对象的情况下,通过类本身调用static方法(多用于工具类,类似于全局方法)、或常量(类似于全局变量)

class StaticSuper {
	// 父类持有的共享变量
	static String str = "父类持有的静态变量";
}

class StaticSubOne extends StaticSuper {}
class StaticSubTwo extends StaticSuper {}


public class StaticConstants {
	public static void main(String[] args) {
		// 共享变量
		System.out.println(StaticSubOne.str);
		System.out.println(StaticSubTwo.str);
		
		StaticSubOne.str = "改变内容";
		
		System.out.println(StaticSuper.str);
	}
}


/*  output ~ 
父类持有的静态变量
父类持有的静态变量
改变内容
 * */

由上面例子可以看出static的常量是全局共享的,包括此类的所有子类也都共享static变量。


四、static方法

静态方法内部,不能调用非静态方法。(特例)
可以在 没有创建任何对象 的前提下,仅仅通过类本身来调用static方法。( 很像全局方法 )
static方法就是没有this的方法
static方法的内部不能调用非静态方法。只能调用静态方法
单例:类设置为public , 把所有 构造器设置为private ,为了阻止任何人创建该类的对象,但是可以通过 static成员内部创建。

class Static {
	static int i = 85;
}

class Incrementable {
	static int increment() {
		Static.i += 1;
		return Static.i;
	}
}


public class StaticMethod {
	public static void main(String[] args) {
		// 静态方法依然共享变量
		System.out.println( Incrementable.increment() ); // 86
		
		Incrementable incrementable = new Incrementable();
		int value = incrementable.increment();
		System.out.println(value);  // 87
		
		System.out.println( Incrementable.increment() ); // 88
	}
}

/*  output ~
86
87
88
 * */

static方法可以不创建对象仅通过类名就可以调用,而且通过类名调用和创建对象调用的static常量是同一个。

五、参考资料:

Java静态变量的初始化(static块的本质)
http://blog.csdn.net/darxin/article/details/5293427


你可能感兴趣的:(第10天 Java static关键字)