测试1:
package polymorphism;
public class Hero {
int moveSpeed; //移动速度
public boolean equals(Object o){
if(o instanceof Hero){
Hero h = (Hero) o;
return this.hp == h.hp;
}
return false;
}
public int getMoveSpeed(){
return this.moveSpeed;
}
public int getMoveSpeed2(){
return 199;
}
}
package polymorphism;
public class ADHero extends Hero {
int moveSpeed=3; //移动速度
public int getMoveSpeed(){
return this.moveSpeed;
}
public int getMoveSpeed2(){
return super.moveSpeed;
}
public static void main(String[] args) {
Hero h1=new Hero();
h1.moveSpeed = 300;
Hero h2=new ADHero();
h2.moveSpeed = 300;
System.out.println(h2.getMoveSpeed());
System.out.println(h2.getMoveSpeed2());
}
}
结果是:
3
300
h2.getMoveSpeed()和h2.getMoveSpeed2()使用了子类中的实现,然而h2.moveSpeed指向了父类中的属性
测试2:
package polymorphism;
public class Hero {
int moveSpeed; //移动速度
public boolean equals(Object o){
if(o instanceof Hero){
Hero h = (Hero) o;
System.out.println(this.moveSpeed+" "+h.moveSpeed);
return this.moveSpeed == h.moveSpeed;
}
return false;
}
}
package polymorphism;
public class ADHero extends Hero {
int moveSpeed=300; //移动速度
public static void main(String[] args) {
Hero h1=new Hero();
h1.moveSpeed = 300;
Hero h2=new ADHero();
System.out.println(h1.equals(h2));
System.out.println(h2.equals(h1));
}
}
结果是:
300 0
false
0 300
false
在Hero h = (Hero) o中,如果o是Hero子类,转换之后,h默认使用o的父类中的moveSpeed。
本文探讨了在Java多态中,当基类和子类具有相同属性名称时,如何访问和调用这些属性。通过测试1和测试2的示例,展示了即使通过类型转换,`h2.getMoveSpeed()`和`h2.getMoveSpeed2()`依旧会调用子类的方法实现,而变量`h2.moveSpeed`则指向父类的属性。这揭示了多态中静态绑定和动态绑定的不同行为。
1943

被折叠的 条评论
为什么被折叠?



