java验证中的数据绑定
我是java初学者。我编写了以下代码java验证中的数据绑定,java,polymorphism,Java,Polymorphism,我是java初学者。我编写了以下代码 class SuperA{ Integer a = 1; protected void f(){ System.out.println("in superA"); } } class Test extends SuperA{ Integer a = 2; protected void f(){ System.out.println("in test"); } public static void main(St
class SuperA{
Integer a = 1;
protected void f(){
System.out.println("in superA");
}
}
class Test extends SuperA{
Integer a = 2;
protected void f(){
System.out.println("in test");
}
public static void main(String... args) throws Exception{
SuperA o = new Test();
o.f();
System.out.println("a = "+o.a);
}
}
输出:在测试中
a=1
我知道为什么它是测试中的,但我不明白为什么a=1
。我想应该是a=2
多态性中调用方法和数据的区别是什么?我建议您这样做:
class SuperA {
protected Integer a = 1;
protected void f() {
System.out.println("in superA");
}
}
class Test extends SuperA {
private static final Integer DEFAULT_A = 2;
public Test() {
super(DEFAULT_A);
}
protected void f(){
System.out.println("in test");
}
}
您的Test
类拥有两个名为a
的独立实例变量。它们可以通过以下方式访问:
this.a
及
这使得它们不同于方法,其中Test
中定义的f(),因此,Test
没有超类版本。运行时多态性不适用于数据变量,即在您的情况下a,因此当您尝试打印o.a时,它将检查SuperA的参考变量类型,在这种情况下,o/p将是1而不是2。
请按链接查看详细信息-->否。我不想解决此问题,但只想知道堆栈上的对象和堆之间的映射是如何完成的。一些较低的视图。所以您是说只覆盖行为而不覆盖数据?覆盖数据毫无意义:无论如何,您不能通过覆盖它来更改任何内容。
class Test extends SuperA{
Integer a = 2;
this.a
((SuperA)this).a