static关键字 和构造代码块

一.static关键字

1.什么是static:

​ 静态修饰符,修饰的方法成为静态方法,修饰的属性成为静态属性。

2 什么时候应该使用static?

答:当该方法是不变的(通常是一些工具类,资源共享类的),且只需要加载一次的,就可以考虑static。

3.static的使用场景

因为非静态的属性和方法都是随着对象的创建而加载的(反过来讲就是只有对象存在时,非静态的属性和方法才会存在),如果是要多个对象共用一个属性或方法该怎么办?

答:在属性和方法前使用static关键字修饰即可,可以实现数据共享。

在这里插入图片描述假设两个窗口同时出售100张票,添加static修饰符,就可以将属性ticketCount设置为公共属性,这样t1.sale()和 t2.sale就会共用一个属性值,同时出售这100张票。

问题1

:非静态和静态的属性或方法如何调用

答: 非静态只能通过对象调用,因为非静态的属性和方法只有在创建对象的时候才会被加载进内存

​ 静态既可以通过对象调用,也可以通过类名调用,建议通过类名调用,(非静态的属性或方法是属于类的)
在这里插入图片描述

问题2:

如果相互调用了会出现什么问题,为什么?

答:不能在静态的方法中调用调用非静态的属性和方法,但是可以在非静态的方法中区调用静态的属性和方法 , 因为非静态的属性和方法只有在创建对象的时候才会被加载进内存,静态的属性和方法是通过对象才会加载。
在这里插入图片描述

问题3:

静态的属性和方法是什么时候加载进内存的?

答:Java文件在编译时会被加载进内存中,其中静态的属性和方法都会随着class文件的加载而加载(类加载的时候,静态的属性和方法就已经加载了)

二.构造代码块和静态代码构造块

构造代码块就是一个没有名字的构造器,同样具有开辟空间和初始化的作用。

构造代码块的初始化比构造器的初始化时间早,所以会先运行构造代码块
在这里插入图片描述静态代码构造块是在类加载的时候就开始运行的,所以输出顺序是3-2-1-5-4,因为代码构造块先于构造器,所以2里面的age为默认值0,静态方法和非静态方法的顺序取决于引用的顺序。