1.static变量
只依赖于类存在,同时通过类名即可访问,不需要通过对象实例来访问;
所有对象实例,关于static变量的值都共享存储在一个共同的内存空间中(栈);
注:static变量的常用情景为,需要统计该类到目前为止一共创建了多少个对象时, 可以在该类的构造函数中加一个static变量++1的操作
1 //如“要求记录Point2D类到目前为止共创建了多少个Point2D类对象” 2 public class Point2D{ 3 private static int numberOfInstances = 0; 4 public Point2D(int initial, int initialY){ 5 x = initialX; 6 y = initialY; 7 numberOfInstances++; 8 } 9 }
2.static方法
只依赖于类存在,同时通过类名即可访问,不需要通过对象实例来访问;
static方法禁止使用非static变量以及非static方法;具体原因可以参考baijiahao.baidu.com/s?id=1660679841519186374&wfr=spider&for=pc;
非静态方法中什么都可以调用;
注:每个实例成员方法内部,底层原理中都有一个this变量,指向调用该方法的具体对象,this的存在允许相同的类实例方法为不同的对象工作
1 public void setX(int newX){ 2 x = newX; 3 } 4 //实例方法会被编译器翻译为如下函数: 5 public void setX(Point2D this, int newX){ 6 this.x = newX; 7 } 8 //对应的对象使用则翻译为: 9 pointOne.setX(30); 10 setX(pointOne, 30); 11 pointTwo.setX(50); 12 setX(pointTwo, 50);
3.static代码块
[1]一个类中只能出现类变量、类方法、静态代码块;
[2]静态代码块只在类第一次被加载时调用;
即在程序运行期间,静态代码块只运行一次;
执行顺序为:静态代码块>匿名代码块>构造函数;
1 class StaticBlock 2 { 3 //静态代码块>匿名代码块>构造函数 4 static 5 { 6 System.out.println("22222"); 7 } 8 { 9 System.out.println("11111"); 10 } 11 public StaticBlock() 12 { 13 System.out.println("33333"); 14 } 15 { 16 System.out.println("44444"); 17 } 18 }
1 public class StaticBlockTest{ 2 3 public static void main(String[] args){ 4 StaticBlock obj1 = new StaticBlock(); 5 StaticBlock obj2 = new StaticBlock(); 6 } 7 }第一次运行到StaticBlock时,就运行static块;每次运行到new了对象出来时,匿名块和构造函数都会被依次调用
结果为:
22222
11111
44444
33333
11111
44444
33333