1.
package readpro;
public class Man extends Person {
public Man(){
System.out.println("Man 初始化");
}
{
System.out.println("Man 普通代码块");
}
static{
System.out.println("static Man");
}
public static void main(String[] args) {
Man man = new Man();
man = new Man();
}
}
class Person{
static Person p = new Person();
public Person(){
System.out.println("Person 初始化");
}
{
System.out.println("Person 普通代码块");
}
static{
System.out.println("static Person");
}
}
结果:当new Man()时,首先查看Man的父类有没有被加载,没有被加载,先加载父类,再加载子类,在加载父类的初始化阶段会对类变量指定值,会执行静态块的代码(静态变量的复制和静态代码块的执行顺序先后按照出现的顺序执行),在本例子中即先对Person p赋指定值new Person();在new Person()的过程中实例化阶段会执行普通代码块的内容会输出,在初始化时会执行构造方法,接着是对子类Man的加载,在初始化阶段回执行静态代码块的内容,然后实例化父类Person执行普通代码块内容,初始化执行构造器方法。这里注意 每次new子类,父类总是被实例化和初始化。
Person 普通代码块
Person 初始化
static Person
static Man
Person 普通代码块
Person 初始化
Man 普通代码块
Man 初始化
Person 普通代码块
Person 初始化
Man 普通代码块
Man 初始化
2.
public class Test1 extends Base {
private String name = "Test1";
public Test1(){
tellName();
printName();
}
public void tellName(){
System.out.println("Test1 tell name "+ name);
}
public void printName(){
System.out.println("Test1 print Name "+ name);
}
public static void main(String[] args) {
new Test1();
}
}
class Base{
private String name = "Base";
public Base(){
tellName();
printName();
}
public void tellName(){
System.out.println("Base tell name "+ name);
}
public void printName(){
System.out.println("Base print Name "+ name);
}
}
输出
Test1 tell name null
Test1 print Name null
Test1 tell name Test1
Test1 print Name Test1
分析:实例化子类时先实例化父类,调用父类的构造方法public Base(){tellName();printName();} ,会调用tellName()和printName()方法,由于子类重写了两个方法,所以调用子类的tellName()和printName()方法,子类还没有被初始化,所以name为null。即出现该结果
持续添加。。。。。