1.Java类内部加载顺序
- 首先我们看一个类内部变量的加载顺序:
- Java的类在Java编译器中,一个基本规则是按照变量定义的顺序来觉得初始化顺序,但对于静态变量和构造方法有些特殊的规则,如下:
- 静态代码块,在类被加载的时候运行,因此只加载一次,且优先于其他变量,常用于运行一些项目启动时需要运行的代码,比如加载项目需要的系统资源等等。
示例:
static{
System.out.println("静态代码块");
}
- 构造代码块,在创建对象的时候执行,且先于构造函数执行。目的也是用于初始化对象,关于和构造函数的不同,我的理解是,如果有多个不同参数的构造函数,就可以提取他们共同的初始化语句到构造代码块,减少重复。
示例:
{
System.out.println("子类构造代码块");
}
- 还有一种普通代码块,写在方法内部。
示例:
public void Method(){
{
System.out.println("普通代码块");
}
}
2.父类和子类的加载顺序
- 在加载父类和子类时,父类优先于子类,但静态内容要先执行,包括静态方法和静态代码块。即:
- 先执行父类静态内容
- 再执行子类静态内容
- 再执行父类构造代码块,父类构造方法
- 再执行子类构造代码块,子类构造方法
3.Java内部类
- Java四种内部类的介绍,我是学习的下面这篇文章
- java内部类及类的加载顺序(二)
- 提几点注意事项:
1.普通成员内部类中不能有static静态变量或静态方法,除非声明为final。原因:一个静态域只有一个实例,不过对于每个外部类对象,会分别有一个单独的内部类实例;如果这个静态域不是final,它就可能不是唯一的(借鉴上面的文章)
2.普通成员内部类中可以直接调用外部类的变量和方法,包括静态的。
3.静态内部类中只能调用外部类的静态变量和方法。
4.代码示例及结果
//父类
public class SuperClass {
static{<