Android-Java-子类实例化过程(内存图)

Posted 原创Android 努力学习 专一安卓 持之以恒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-Java-子类实例化过程(内存图)相关的知识,希望对你有一定的参考价值。

案例一:

package android.java.oop15;

// 描述Person对象
class Person {

    // 构造方法就算不写 默认有一个隐式的无参构造方法:public Person(){} ,一旦写了构造方法 隐式的构造方法就消失了

    public Person() {
        System.out.println("Person() run...");
    }

}

// 描述Student对象
class Student extends Person {

    // 构造方法就算不写 默认有一个隐式的无参构造方法:public Person(){} ,一旦写了构造方法 隐式的构造方法就消失了

    public Student() {
        System.out.println("Student() run...");
    }

}

public class DemoTest {

    public static void main(String[] args) {

        Student student = new Student();

    }

}

 

执行结果:

 

 案例一分析:

  为什么 new Student(); 会去调用 Person的构造方法?,然后Person的构造方法先执行 Student的构造方法后执行?

    答:因为Student 继承了 Person,所以在实例化Student的时候 需要先父类初始化,才能拿到父类的内容,然后在Student子类初始化;

 

 




 

 

案例二:

package android.java.oop15;

// 描述Person对象
class Person {

    // 构造方法就算不写 默认有一个隐式的无参构造方法:public Person(){} ,一旦写了构造方法 隐式的构造方法就消失了

    public Person(String value) {
        System.out.println("Person() run...");
    }

}

// 描述Student对象
class Student extends Person {

    // 构造方法就算不写 默认有一个隐式的无参构造方法:public Person(){} ,一旦写了构造方法 隐式的构造方法就消失了

    public Student() {
        // super(); // 报错❌ 不能(隐式/显示)调用Person的无参构造方法,因为Person的无参构造方法已经没有了
        // 显示调用 Person(String value){}
        super("人名");
        System.out.println("Student() run...");
    }

}

public class DemoTest {

    public static void main(String[] args) {

        Student student = new Student();

    }

}

 

执行结果:

 

 

案例三:

package android.java.oop15;

// 描述Person对象
class Person {

    // 构造方法就算不写 默认有一个隐式的无参构造方法:public Person(){} ,一旦写了构造方法 隐式的构造方法就消失了

    public Person(String value) {
        System.out.println("Person() run...");
    }

}

// 描述Student对象
class Student extends Person {

    // 构造方法就算不写 默认有一个隐式的无参构造方法:public Person(){} ,一旦写了构造方法 隐式的构造方法就消失了

    public Student() {
        this("薛刚当"); // 注意:构造方法的第一行一旦写了 this/super 隐式的super就消失了
        System.out.println("Student() run...");
    }

    public Student(String value) {
        // super(); // 报错❌ 不能(隐式/显示)调用Person的无参构造方法,因为Person的无参构造方法已经没有了
        // 显示调用 Person(String value){}
        super(value); // 注意:构造方法的第一行一旦写了 this/super 隐式的super就消失了
    }

}

public class DemoTest {

    public static void main(String[] args) {

        Student student = new Student();

    }

}

 

执行结果:

 

 

案例二 案例三 分析:所有的构造方法,隐式第一行 都是 super(); --调用-> public 父类(){} ,  所有构造方法 第一行一旦写了 this() this(值) super() super(值) 第一行隐式的super()消失

 




 

 

 

 

案例四-(子父类 有内存图):

package android.java.oop15;

// 描述Person对象
class Person {

    public String name = "李四";
    public int age = 90;

    // 构造方法就算不写 默认有一个隐式的无参构造方法:public Person(){} ,一旦写了构造方法 隐式的构造方法就消失了

    public Person() {
        System.out.println("Person() run...");
    }

}

// 描述Student对象
class Student extends Person {

    // 构造方法就算不写 默认有一个隐式的无参构造方法:public Person(){} ,一旦写了构造方法 隐式的构造方法就消失了

    public Student() {
        System.out.println("Student() run... --> name:" + this.name + " age:" + age);
    }

}

public class DemoTest {

    public static void main(String[] args) {

        Student student = new Student();

    }

}

 

执行结果:

 

 

以上案例对应内存图:

 

以上是关于Android-Java-子类实例化过程(内存图)的主要内容,如果未能解决你的问题,请参考以下文章

Java对象的实例化过程

5_面向对象-中之子类对象实例化全过程

Android-Java-饿汉式单例模式(内存图)

Android-Java-构造函数间调用&this内存图

Android-Java-静态变量与静态方法&普通变量与普通方法(内存图 完整版)

子类对象的实例化过程