首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对这个简单的多态示例感到困惑

对这个简单的多态示例感到困惑
EN

Stack Overflow用户
提问于 2012-09-16 19:28:08
回答 2查看 685关注 0票数 0

请看下面的代码:

代码语言:javascript
复制
class Foo {
    public int a;
    public Foo() {
        a = 3;
    }
    public void addFive() {
        a += 5;
    }
    public int getA() {
        System.out.println("we are here in base class!");
        return  a;
    }
}

public class Polymorphism extends Foo{
    public int a;
    public Poylmorphism() {
        a = 5;
    }
    public void addFive() {
        System.out.println("we are here !" + a);
        a += 5;
    }
    public int getA() {
        System.out.println("we are here in sub class!");
        return  a;
    }

    public static void main(String [] main) {
        Foo f = new Polymorphism();
        f.addFive();
        System.out.println(f.getA());
        System.out.println(f.a);
    }
}

这里我们将类Polymorphism的对象引用赋值给Foo类型的变量,典型的多态。现在我们调用已在类Polymorphism中重写的方法addFive。然后,我们打印来自getter方法的变量值,该方法也已在类多态性中被覆盖。所以我们得到的答案是10。但是当公共变量a为SOP时,我们得到的答案是3!

怎么会出这事?即使引用变量类型是Foo,但它引用的是多态类的对象。那么,为什么访问f.a不会导致Polymorphism类中的a的值被打印出来呢?请帮帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-16 19:32:09

这是因为你不能重写类变量。在访问类变量时,决定您将获得什么的是引用的类型,而不是对象的类型。

如果在子类中去掉a的重声明,那么我假设行为会更符合预期。

票数 2
EN

Stack Overflow用户

发布于 2012-09-16 19:31:05

你隐藏了Polymorphisma --你应该为此得到一个编译器警告。因此,这是两个截然不同的a字段。与方法不同,字段不能是虚的。好的做法是根本不使用公共字段,而只使用改变私有状态的方法(封装)。

如果你想让它成为虚拟的,你需要用访问器方法把它变成一个属性(例如你已经拥有的:getA)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12446472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档