一.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,静态方法和非静态方法的顺序取决于引用的顺序。