android 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();

}

}

执行结果:

c5cf595b1f311a42800f81fe632c0ed8.png

案例一分析:

为什么 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();

}

}

执行结果:

c5cf595b1f311a42800f81fe632c0ed8.png

案例三:

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();

}

}

执行结果:

c5cf595b1f311a42800f81fe632c0ed8.png

案例二 案例三 分析:所有的构造方法,隐式第一行 都是 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();

}

}

执行结果:

30c981b7972986bba9539885df2ff1a2.png

以上案例对应内存图:

1490291-20190205145943501-1927484596.png

标签:Java,构造方法,子类,隐式,Person,Student,Android,super,public

来源: https://www.cnblogs.com/android-deli/p/10352767.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值