class B extends A ,然后A类也就是父类里面有静态代码块,静态方法,静态成员变量,构造代码块,普通成员变量,普通方法。
经测试,得到如下结论:
1.父类【静态成员】和【静态代码块】,按照代码中出现的顺序依次执行。
2.子类【静态成员】和【静态代码块】,按照代码中出现的顺序依次执行。
3.父类的【构造代码块】和【普通成员变量被普通成员方法赋值】,按在代码中出现的顺序依次执行。
4.执行父类的构造方法。
5.子类的【普通成员变量被普通成员方法赋值】和【普通代码块】,按在代码中出现的顺序依次执行。
6.执行子类的构造方法。
Example:
父类:
class Parent{
static {
System.out.println("父类:静态代码块");
}
{
System.out.println("父类:构造代码块");
}
private static String staticStringInParent = initStaticStringInParent();
private String stringInParent = initStringInParent();
public Parent(){
System.out.println("父类:构造方法");
}
private static String initStaticStringInParent(){
System.out.println("父类:静态方法,被静态成员变量赋值调用");
return "initStaticStringInParent";
}
private String initStringInParent(){
System.out.println("父类:普通成员方法,被普通成员变量赋值调用");
return "initStringInParent";
}
}
子类:
class Child extends Parent{
private String stringInChild = initStringInChild();
private static String staticStringInParent = initStaticStringInChild();
{
System.out.println("子类:构造代码块");
}
static{
System.out.println("子类:静态代码块");
}
public Child(){
System.out.println("子类:构造方法");
}
private static String initStaticStringInChild(){
System.out.println("子类:静态方法,被静态成员变量赋值调用");
return "initStaticStringInChild";
}
private String initStringInChild(){
System.out.println("子类:普通方法,被普通成员变量赋值调用");
return "initStringInChild";
}
}
测试方法:
/**
* @author: hyl
* @date: 2019/10/20
**/
public class Test {
public static void main(String[] args) {
System.out.println("Start");
new Child();
System.out.println("End");
}
}
运行结果:
根据结果我可以可以看出和开头给的结论是一致的,在编写代码或者面积及笔试时,按照上面结论来做是没问题的。
大家看下下面这段代码的结果是否和你想的一样呢:
/**
* @author: hyl
* @date: 2019/10/20
**/
class Father{
public static Father father = new Father();
public int j = 0;
static{
System.out.println("Father static block");
}
{
System.out.println("Father not static block");
}
public Father(){
System.out.println("Father Constructor");
}
}
public class Test1 extends Father{
public static void main(String[] args) {
new Father();
}
}
很多人会说,这不是和上面的结论就不一样了呢?
其实在在 public static Father father=new Father(); 时,静态代码块虽还未执行,但可以看作它已经加载被确定执行,所以这里并没有执行静态代码块。
文章为ArvinHan原创,如果文章有错的地方欢迎指正,大家互相交流。