修改静态变量之后,全局都会被修改;(类名.属性 重新赋值)
---
类加载时机:-->main方法,new对象,访问静态成员,静态对象,反射,继承
----------------------------------------------------
关键字:包
--
-------
一个类中全部都是静态方法-->工具类
注意事项
习题:
最后 的时候,生成Demo的对象,要先加载成员变量,最后才构造器赋值;成员变量到Dog里会输出一句dog然后再构造器"hello word";
解:main触发Demo的类加载,-->静态Cat,Cat中-->静态Dog;print"dog";返回到Cat输出"cat";返回到main中,输出"hello world";然后new Demo-->成员变量赋值-->生成dog前调用空参构造器输出"dog";
然后调用Demo构造器输出"demo"
"dog
cat
hello world
dog
demo"
构造器之前的不一定要生成对象,而生成对象就一定执行构造器了
-----------------------------------------------------------------------------------------
代码块
默认初始化-->代码块/显示初始化(按照书写顺序执行)-->构造器
总结,代码块在反编译中不存在:编译器智能的把写在后的代码块或者显示赋值,放到了(所有)构造器中。
因此,只要生成对象,构造代码块都会执行。
也就是说,构造代码块(非静态,静态只会执行一次)都会放到构造器里。
注意:调用this()构造器的时候,会先调用成员变量的显示赋值。
1.如果成员变量的赋值依赖于一个复杂算法,不是一个赋值就能执行的。就需要构造代码块进行赋值。因此需要静态代码块给静态变量赋值;
2.因为构造代码块都会被放入构造器中,并且每次生成对象都会执行(非静态代码块)。就可以将所有构造器要执行的共同部分放入构造代码块。(提取公因式)。
-----------------静态代码块------------------
创建对象一定类加载,类加载不一定创建对象。比如main方法的所在类,一定会类加载,但是不一定会创建对象;
---
就是一个类的内加载只会加载一次;
导包--------------------------
一个java下的同一个类 ,是同一个编译单元;
不导包就就近原则;
导入另一个包下(尤其是同名类),需要导包;
---面向过程