父类 子类成员变量关系:
若是子类的引用调用 父类有但是子类没有 成员变量时候
子类其实调用的是父类的成员变量, 但是也是属于子类的属性(特性),该属性受父类的变化影响
子类在new的时候产生了一个父类对象 在内存中,
class Animal {
protected String name= "mimi";
public String getName() {return name;}
}
class Cat extends Animal{
String name;
Cat(String name) {
this.name = name;
}
}
public class Test3 {
public static void main(String[] args) {
Cat c1 = new Cat("pipi");
System.out.println(c1.getName()); // 返回“mimi”
System.out.println(c1.name); // 返回“pipi”
Animal c2 = (Animal)c1;
System.out.println(c2.name); // 返回“mimi”
}
}
因为,有继承关系的两个类是这样的,最终new出来的子类的对象的内部会有一个父类对象,在这里也就是说,这Cat对象的内部包含有一个Animal对象,而且Cat类中并没有定义getName()方法,换句话说就是没有重写父类Animal的getName()方法,所以c1.getName(),表面上看,我们总是说此方法是继承下来的
,所以在Cat类中没有定义,但是可以使用,这只是表面上这么理解,实际上内存中是什么样?就是我上面说的那样,Cat对象的内部还有一个Animal对象,所以c1.getName()的时候,实际上是调用的它里面的那个父类Animal对象的getName()方法,而Animal类中定义的getName()是return name;注意,return的这个name指的是自己Animal的name,对吧,所以打印出mimi