class Animal{
int m =100;
public int seeM(){
return m;
}
public int getM(){
return m;
}
}
class Dog extends Animal{
int m=6;
public int seeM(){
return m;
}
}
public class E{
public static void main( String[] args) {
Animal animal =null;
Dog dog= new Dog();
animal =dog;
System.out.printf("%d:%d:%d:%d",dog.seeM(),animal.seeM(),animal.getM(),animal.seeM());//【代码}
}
}
为什么animal.getM()不是6,而是100??最好可以用内存分配讲解一下,求大佬解释解释
1.子类继承父类非私有成员,所以子类Dog 的对象可以调用getM()方法
2.继承多态:父类引用指向子类对象,方法调用,先看子类是否有重写,而Dog类中没有getM()方法,所以使用父类中的getM()方法
3.使用父类getM()方法,返回变量m,就近原则,获取父类中m=100的值
animal.getM() 等价于 dog调用父类的getM()方法,default属性修饰的变量,子类是不能使用父类的,所以用的是父类的属性,当然是100。
先说下,这里并没有转型,只是静态类型与实际类型的问题。
变量animal的类型有两个,一个是静态类型Animal,一个实际类型Dog。而方法的重写是根据其实际类型来调用方法的,所以你这个调用:animal.getM(),自然输出的就是6了。
为什么重写是根据实际类型调用方法?
这也就是常说的面向父类,面向接口编程了,虚拟机中在类加载的解析阶段将,符号引用转换为直接引用,这里直接饮用就是指向Dog的类型的,所以你在执行animal.getM(),自输出的是6.