java中继承和组合的运用以及初始化顺序

通过demo展现java中 包含继承和组合时,程序的初始化顺序.

1.初始化顺序

public class App2 {

    public static void main(String[] args){
        new Child1();
    }
}

class Parent {

    public Parent(){
        System.out.println("-----parent constructor method");
    }
    static{
        System.out.println("-----parent static block");
    }

    {
        System.out.println("-----parent non static block");
    }
}

class Child1 extends Parent{

    private DependencyClass dependencyClass = new DependencyClass();

    public Child1(){
        System.out.println("*****child1 constructor method");
    }

    static{
        System.out.println("*****child1 static block");
    }

    {
        System.out.println("*****child1 non static block");
    }

    static{
        System.out.println("*****child1 static block1");
    }

    {
        System.out.println("*****child1 non static block1");
    }


}


class DependencyClass{
    DependencyClass(){
        System.out.println("=====dependencyClass constructor method");
    }

    static{
        System.out.println("=====dependencyClass static block");
    }

    {
        System.out.println("=====dependencyClass non static block");
    }
}

输出:
-----parent static block
*****child1 static block
*****child1 static block1
-----parent non static block
-----parent constructor method
=====dependencyClass static block
=====dependencyClass non static block
=====dependencyClass constructor method
*****child1 non static block
*****child1 non static block1
*****child1 constructor method

从输出结果看:
父类的静态代码块->子类的静态代码块->父类的非静态代码块->父类的构造方法->成员初始化->子类的非静态代码块->子类的构造函数

还可以看出 静态代码块以及非静态代码块都是按声明顺序执行的

2.继承中的注意点

package javaBase1;

public class App3 {

    public static void main(String[] args){
        new Child1();
    }
}

class Parent{

    public Parent(){
        this.showName();
    }

    public void showName(){
        System.out.println("parent method");
    }
}

class Child1 extends Parent{
    private String name = "张三";

    public Child1(){
        name = "李四";
    }
    @Override
    public void showName(){
        System.out.println("Child1 method " + name);
    }
}

输出:
Child1 method null

java中 this指向的是当前实例, new 的是Child1 初始化父类的时候 就会调用Child1的方法.
java编程思想中说: 一个动态绑定的方法调用会向外深入到继承层次结构内部.
但此时子类Child1还未初始话 成员属性还未赋值

你可能感兴趣的:(java基础)