Cra*_*lus 11 java oop polymorphism overriding class
我知道这种行为,但我不确定为什么会这样.
据我所知,java中的实例变量没有多态性.变量由编译器静态解析.
但在下面我对某些事感到困惑:
class Animal{
String name = "Animal";
public void display(){
System.out.println("My name is "+ name);
}
}
public class Dog extends Animal {
String name = "Dog";
public static void main(String[] args) {
Animal a = new Dog();
Dog d = new Dog();
System.out.println(a.name);//Line 1
a.display();//Line 2
d.display();//Line 3
}
}
Run Code Online (Sandbox Code Playgroud)
我认为Line 1它会显示Animal为静态类型a(由编译器解析).
让我困惑的是为什么Line 3还要展示My name is Animal?
将尝试调用该方法,Dog因为这是运行时的实际对象,因为它不会被覆盖,所以可以在父类中找到该方法Animal.
我没有得到的是为什么在操作的实际对象是a时,name在方法内部使用父类.它不隐藏父变量吗?在我看来它并不是因为类型是静态解析的.这不是oject的内存布局的一部分吗?
就像里面只有父的变量是可见的.为什么? displayDognameDogdisplay
更新:
@ Razvan和@LouisWasserman的答案很有帮助.
在这之后我还有最后一个问题:
两者的要点似乎如下:
来自@Razyan
System.out.println("My name is "+ this.name); //<-- note the this
来自@Louis
那this指的是Animal那个the implementation of display() is in the Animal class.
到目前为止还好.但是,如果我修改display()如下这些事实如何与这些点一致:
class Animal{
String name = "Animal";
public void display(){
System.out.println("Current class is "+ this.getClass().getName());
System.out.println("My name is "+ name);
}
}
Run Code Online (Sandbox Code Playgroud)
然后结果:
Dog d = new Dog();
d.display();
Run Code Online (Sandbox Code Playgroud)
目前的班级是狗
我的名字是动物
我期待那this里面display会是Animal因为我理解这里的答案.但事实并非如此.为什么?
Raz*_*van 13
当你调用d.display()的Animal.display()是所谓的,因为你没有在狗类中重写它.
所以假想的实现Dog.display()将是这样的:
public void display(){
super.display();
}
Run Code Online (Sandbox Code Playgroud)
Animal.display()的实现是:
public void display(){
System.out.println("My name is "+ this.name); //<-- note the this
}
Run Code Online (Sandbox Code Playgroud)
该Animal.display()方法甚至不知道对象的存在Dog以及其name变量的存在