1.我理解的static的作用就是把对象的东西变成类的东西
2.因为static修饰的东西是类的东西所以在随着类的加载而加载
3.在类的加载:加载——验证——准备——解析——初始化——使用——卸载这几步中,static修饰的变量在准备阶段会给默认值,然后再初始化阶段(注意是<client>,<client>初始化和<init>实例化要分清楚)给赋在代码中的值
类的初始化<client>其实就是把静态变量和静态代码块儿,按照代码顺序执行在字节码中他会
都放到 静态代码块儿中:
public class A {
static {
System.out.println("我是父类的静态代码块儿");
}
public static int q = 10;
A() {
}
}
会变成:
static {
System.out.println("我是父类的静态代码块儿");
public static int q = 10;
}
4.static为什么在内部类中不能有static:
其实归根结底,还是类与对象的区别,静态属性不依赖于对象,因为它保存在jvm的静态区,所以访问修改的时候不需要依赖当前有没有存活的对象,在虚拟机加载的时候也是优先于实例生成的。而实例对象则是保存在jvm的堆内存中,想要访问内部类,必须先实例化外部类,然后通过外部类才能访问内部类。内部类其实也可以认为是外部类的一个成员变量,只要是成员变量,各个对象都是不依赖的,静态属性的出现破坏了这一逻辑,所以java语言在语义层面不允许我们那么做,这其实不是技术问题,是一个语言的逻辑和语义问题。
5.如果是静态内部类在初始化<client>或者实例化<init>的时候会互相干涉吗
public class A {
static {
System.out.println("我是A的静态代码块儿");
}
A() {
}
public static class C{
static {
System.out.println("我是C的静态代码块儿");
}
public static void w(){
System.out.println("我是C的静态方法W");
}
}
}
C:<client>
class Test{
public static void main(String[] args) {
A.C.w();
// A a = new A();
}
}
结果:
这个结果显示C初始化<client>的时候并不会影响A,A不会跟着初始化
C:<client>加<init>
class Test{
public static void main(String[] args) {
A.C c = new A.C();
// A.C.w();
// A a = new A();
}
}
结果:
结果显示,C实例化的时候也不会引起A的初始化
A:<client>加<init>
结果:
并不会引起C的初始化
综上所述,如果是静态内部类的话,那它和外面的类是一样的,进行初始化等一系列操作并不会互相影响