一、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常量是同一个。