上转型对象调用隐藏变量的情况是怎样的?

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.