
了解java类加载机制的时候,我们有时候会遇到一些谁先谁后的问题,我们当然不能一眼看出来 最直观的方法就是写代码跑一下
父类
package com.nwk;
public class Father {
private String name;
private int age;
private nwk s=new nwk("父亲");
private static String a = father();
static {
System.out.println("父类静态块");
}
public static String father()
{
System.out.println("父类静态变量");
return "父类静态变量";
}
{
System.out.println("父类非静态块");
}
public Father(String name, int age) {
this.name = name;
this.age = age;
}
public Father(){
System.out.println("父类构造方法");
}
public void speak(){
System.out.println("父亲");
}
}
子类
package com.nwk;
public class Son extends Father {
private String stuNo;
private nwk s=new nwk("儿子");
static {
System.out.println("子类静态块");
}
private static String b = child();
public static String child()
{
System.out.println("子类静态变量");
return "子类静态变量";
}
public Son(String name, int age, String stuNo) {
this.stuNo = stuNo;
}
public Son(String stuNo) {
this.stuNo = stuNo;
}
public Son(){
System.out.println("子类构造方法");
}
{
System.out.println("子类非静态块");
}
@Override
public void speak(){
System.out.println("儿子");
}
}
public class nwk {
private String name;
public nwk() {
System.out.println("变量说明");
}
public nwk(String name) {
this.name = name;
System.out.println("变量"+name);
}
}
测试类
package com.nwk;
public class Test {
public static void main(String[] args) {
Son son1=new Son();
son1.speak();
System.out.println("=================");
Son son2=new Son();
}
}
结果
把上面代码跑一遍你会发现
所有的静态变量,无论是父类还是子类只会被加载一次。
其中 静态代码块,在类被加载的时候运行,因此只加载一次,且优先于其他变量,常用于运行一些项目启动时需要运行的代码,比如加载项目需要的系统资源等等。静态变量 所有该类的对象共同具有的属性。
静态变量的加载顺序与代码的书写顺序有关
我们可以发现父类与子类的静态块与静态变量加载的顺序不一样,因为我们的书写顺序不同。
动态成员变量优先于代码块
动态成员变量定义在每次实例化对象时在构造函数之前执行
代码块顺序优先于构造方法
构造代码块(代码块),在创建对象的时候执行,且先于构造函数执行。目的也是用于初始化对象,关于和构造函数的不同,
**如果一个类具有父类,在类加载的时候都是先加载父类的方法(**相当于构造了一个父类对象)