java基础篇:子类实例化的执行顺序(静态,构造方法,成员方法,成员属性)

本文目的:
旨在总结所学的理论知识,通过自己写demo小例,强化所学的基础理论知识,已达到温故而知新的目的。希望对刚接触java,还比较懵圈的朋友,有一个综合性的代码来解释实例化过程,这将帮助你理解代码的来去有很大的帮助。
结论:
1.父类静态方法和静态代码块,按在代码中出现的顺序依次执行。
2.子类静态方法和静态代码块,按在代码中出现的顺序依次执行。
3. 父类的构造方法和代码块,按在代码中出现的顺序依次执行。父类构造方法中调用自己未实现的抽象方法时,可以在子类还未实例化前调用子类的实现方法(简单说:就是可以先于子类用子类的方法,即使子类还没有初始化)
4.子类的构造方法和代码块,按在代码中出现的顺序依次执行。
5.执行子类成员变量和成员方法,按在代码中出现的顺序依次执行。(特殊有一点:如果是引用对象,且是同一个父类,则不会执行静态代码部分)

代码实现如下:

1 父类:Animal类

public abstract class Animal {

    {//父类代码块
        System.out.println("执行Animal的代码块");

    }
    static{ //父类静态代码块
        System.out.println("执行Animal的静态代码块");
    }

    //父类的构造方法:依次在调用父类的几个成员方法
    public Animal(){
    System.out.println("我是Animal父类");   
    eat();
    say();
    sleep();
    }
    public abstract void eat();
    public abstract void say();
    public abstract void sleep();
}

2 子类1:猫类

public class Cat extends Animal {

    {     // 代码块
        System.out.println("执行cat的代码块");

    }
    static {// 静态代码块
        System.out.println("执行cat的静态代码块");
    }

    // 猫类的构造方法:里面依次在注入属性值和调用成员方法
    public Cat() {
        System.out.println("执行构造方法实例化一只小猫");
        System.out.println("猫类要开始吃叫睡和有名字:");
        this.setName("小花猫");
        sleep();
        this.setAge(1);
        this.setDog(new Dog());
        eat();
        say();
    }

    // 三个属性:分别为String类型,int类型和引用类型
    private String name;
    private int age;
    private Dog dog;

    // 猫吃的方法
    @Override
    public void eat() {
        System.out.println("小猫吃");

    }

    // 猫叫的方法
    @Override
    public void say() {
        System.out.println("小猫叫");

    }

    // 猫睡觉的方法
    @Override
    public void sleep() {
        System.out.println("小猫睡");

    }
    // 以下是set get方法

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("在给小猫设置名字");
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        System.out.println("在给小猫设置年龄");
        this.age = age;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        System.out.println("在给小猫设置dog对象属性");
        this.dog = dog;
    }

}

3 子类2: 狗类

public class Dog  extends Animal {

    {
        System.out.println("执行Dog的代码块");

    }
    static{
        System.out.println("执行Dog的静态代码块");
    }


    public Dog() {
        System.out.println("实例化一只小狗");
    }
    @Override
    public void eat() {
        System.out.println("小狗吃");

    }

    @Override
    public void say() {
        System.out.println("小狗叫");      
    }

    @Override
    public void sleep() {
        System.out.println("小狗睡");

    }



}

4 测试类:

public class demo {

    public static void main(String[] args) {
        Cat cat =new Cat();
        System.out.println("------------------华丽丽的分割线----------------");
        Dog dog =new Dog();
    }

}

5 测试结果:

执行Animal的静态代码块
执行cat的静态代码块
执行Animal的代码块
我是Animal父类
小猫吃
小猫叫
小猫睡
执行cat的代码块
执行构造方法实例化一只小猫
猫类要开始吃叫睡和有名字:
在给小猫设置名字
小猫睡
在给小猫设置年龄
执行Dog的静态代码块
执行Animal的代码块
我是Animal父类
小狗吃
小狗叫
小狗睡
执行Dog的代码块
实例化一只小狗
在给小猫设置dog对象属性
小猫吃
小猫叫
——————华丽丽的分割线—————-
执行Animal的代码块
我是Animal父类
小狗吃
小狗叫
小狗睡
执行Dog的代码块
实例化一只小狗

6 结论
结果与上述情况吻合,希望此例对大家有帮助

你可能感兴趣的:(java基础篇,java,class,实例,执行顺序)