zoukankan      html  css  js  c++  java
  • 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();
    
        }
    
    }

    执行结果:

     

    以上案例对应内存图:

  • 相关阅读:
    Python常用模块——第三方开源模块的安装使用
    Python常用模块——模块介绍与导入
    Linux文本编辑器vim
    Linux文件和文件夹的操作
    网络编程之IO模型——selectors模块
    设计模式学习(19)- 中介者模式
    设计模式学习(18)- 迭代器模式
    设计模式学习(17)- 解释器模式
    设计模式学习(16)- 命令模式
    设计模式学习(15)- 责任链模式
  • 原文地址:https://www.cnblogs.com/android-deli/p/10352767.html
Copyright © 2011-2022 走看看