若不用new 则只加载静态修饰的内容
静态变量>静态块>mian
public class Father {
int i;
static int staticI;
static {System.out.println("Father 静态代码块1"+" (++staticI)="+(++staticI));}
{System.out.println("Father 非静态代码块1"+" i="+i+" (++staticI)="+(++staticI));}
public Father() {System.out.println("Father 构造器");}
{System.out.println("Father 非静态代码块2"+" i="+i+" (++staticI)="+(++staticI));}
static {System.out.println("Father 静态代码块2"+" (++staticI)="+(++staticI));}
public static void main(String[] args) {System.out.println("main 方法"+" (++staticI)="+(++staticI));}
{System.out.println("Father 非静态代码块3"+" i="+i+" (++staticI)="+(++staticI));}
static {System.out.println("Father 静态代码块3"+" (++staticI)="+(++staticI));}
}
运行结果
Father 静态代码块1 (++staticI)=1
Father 静态代码块2 (++staticI)=2
Father 静态代码块3 (++staticI)=3
main 方法 (++staticI)=4
静态内容>非静态变量>非静态块>构造器
将main也归纳到静态内容
将上面代码的main改造:
public static void main(String[] args) {
System.out.println("main 方法"+" (++staticI)="+(++staticI));
new Father();
}
运行结果
Father 静态代码块1 (++staticI)=1
Father 静态代码块2 (++staticI)=2
Father 静态代码块3 (++staticI)=3
main 方法 (++staticI)=4
Father 非静态代码块1 i=0 (++staticI)=5
Father 非静态代码块2 i=0 (++staticI)=6
Father 非静态代码块3 i=0 (++staticI)=7
Father 构造器
结论
- 加载的顺序从上至下
- 静态变量>静态块>main>非静态变量>非静态块>构造器
有子类又会咋么样呢?
既然上面已经证明了在遵循加载规则的情况下顺序为从上至下
那么就可以简化代码了
public class CopyOfFather {
int i;
static int staticI;
static {System.out.println("Father 静态代码块1"+" (++staticI)="+(++staticI));}
{System.out.println("Father 非静态代码块1"+" i="+i+" (++staticI)="+(++staticI));}
public CopyOfFather() {System.out.println("Father 构造器");}
public static void main(String[] args) {
System.out.println("main 方法");
System.out.println("(++CopyOfSon.staticI)="+(++CopyOfSon.staticI));
}
}
class CopyOfSon extends CopyOfFather {
int i;
static int staticI;
public CopyOfSon() {System.out.println("Son 构造器");}
static {System.out.println("Son 静态代码块1"+" (++staticI)="+(++staticI));}
{System.out.println("Son 非静态代码块1"+" i="+i+" (++staticI)="+(++staticI));}
}
执行结果
Father 静态代码块1 (++staticI)=1
main 方法
Son 静态代码块1 (++staticI)=1
(++CopyOfSon.staticI)=2
结论:父类静态内容>子类静态内容
new 子类会怎么样
改造main:
public static void main(String[] args) {
System.out.println("main 方法");
new CopyOfSon();
}
运行结果
Father 静态代码块1 (++staticI)=1
main 方法
Son 静态代码块1 (++staticI)=1
Father 非静态代码块1 i=0 (++staticI)=2
Father 构造器
Son 非静态代码块1 i=0 (++staticI)=2
Son 构造器
结论
此处非静态内容不包括构造器
父类静态内容>子类静态内容>父类非静态内容>父类构造器>子类非静态内容>子类构造器
详细结论
父类静态变量>父类静态代码块>父类main>子类静态变量>子类静态代码块>父类非静态变量>父类非静态代码块>父类构造器>子类非静态变量>子类非静态代码块>子类构造器
请记住:
1.静态>非静态
2.变量>代码块: 先定义变量后在代码块使用
3.构造器在最后