内存布局:
当第八行创建son这个对象的时候,在方法区里面:最先加载的是object类(顶级父类),然后加载grandpa类,然后是father类,然后加载son 。
之后在堆里面开辟一个空间,这个空间第一部分是两个地址,分别指向常量池里面的grandpa类里面的两个属性;第二部分有一个地址,指向常量池里面的father类的String属性,还有以一个age类型的数据;第三部分有个地址,指向常量池里面的Son类的String属性
之后,堆里面开辟的这个空间的地址就会传给栈里面的son对象引用
【总的来说,先在方法区里面按照类的继承关系加载这些类,然后在堆里面的空间加载对应的属性】
对象调用属性的时候,调用的是哪个类的属性?
先看子类有没有这个属性,要是有并且可以访问的话,就返回信息;如果子类没有,就看父类有没有这个属性,要是父类有并且可以访问,就返回父类的信息;要是父类也没就,就在往上找,以此类推....直到object....
关于可以访问:如果一直“往上找”,找到需要的属性,但是权限是private,那么就会报错。
【解决方法:可以在这个类里面写个public的方法,通过这个方法去访问】
如果这个类的这个属性是private,但是这个类的父类的这个属性是public,那么到底返回哪个值?
【返回第一个类的值,因为到第一个类的时候就已经找到了需要的属性,就不会继续往上找了】
案例 3 ExtendsExercise03.java
编写 Computer 类,包含 CPU、内存、硬盘等属性,getDetails 方法用于返回 Computer 的详细信息
编写 PC 子类,继承 Computer 类,添加特有属性【品牌 brand】
编写 NotePad 子类,继承 Computer 类,添加特有属性【color】
编写 Test 类,在 main 方法中创建 PC 和 NotePad 对象,分别给对象中特有的属性赋值,以及从 Computer 类继承的
属性赋值,并使用方法并打印输出信息
package extends02;
/*
编写 Computer 类,包含 CPU、内存、硬盘等属性,
getDetails 方法用于返回 Computer 的详细信息
编写 PC 子类,继承 Computer 类,添加特有属性【品牌 brand】
编写 NotePad 子类,继承 Computer 类,添加特有属性【color】
编写 Test 类,在 main 方法中创建 PC 和 NotePad 对象,
分别给对象中特有的属性赋值,以及从 Computer 类继承的 属性赋值,并使用方法并打印输出信息
*/
public class ExtendsExercise {
public static void main(String[] args) {
PC pc = new PC(256,"R7-5800H","固态硬盘","联想");
pc.dayin();
NotePad notePad = new NotePad(512,"R5-4800H","固态硬盘","red");
notePad.dayin();
Computer computer = new Computer(1024,"R7-4800H","固态硬盘");
System.out.println(computer.getDetails());
}
}
class Computer{
private int neicun;
private String cpu;
private String yingpan;
//构造器(全属性)
public Computer(int neicun, String cpu, String yingpan) {
this.neicun = neicun;
this.cpu = cpu;
this.yingpan = yingpan;
}
public int getNeicun() {
return neicun;
}
public void setNeicun(int neicun) {
this.neicun = neicun;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getYingpan() {
return yingpan;
}
public void setYingpan(String yingpan) {
this.yingpan = yingpan;
}
public String getDetails(){//返回 Computer 的详细信息
return "硬盘:"+yingpan+" 内存:"+neicun+" Cpu:"+cpu;
}
}
class PC extends Computer{
private String brand;
//构造器(除了自己的属性还有继承父类的属性)
public PC(int neicun, String cpu, String yingpan, String brand) {
super(neicun, cpu, yingpan);//自动用super指定父类的构造器
this.brand = brand;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
//打印这个类的信息
public void dayin(){
System.out.println(getDetails()+"品牌:"+ getBrand());
}
}
class NotePad extends Computer{
String color;
//构造器
public NotePad(int neicun, String cpu, String yingpan, String color) {
super(neicun, cpu, yingpan);
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//打印这个类的信息
public void dayin(){
System.out.println(getDetails()+"颜色:"+ getColor());
}
}