首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java代码说明

Java代码说明
EN

Stack Overflow用户
提问于 2011-03-14 02:16:11
回答 4查看 736关注 0票数 2
代码语言:javascript
复制
class Base 
{
    int i = 99;
    public void amethod()
    {
        System.out.println("Base.amethod()");
    }

    Base()
    {
        amethod();
    }
}
public class Derived extends Base
{
    int i = -1;

    public static void main(String argv[])
    {
        Base b = new Derived();
        System.out.println(b.i);
        b.amethod();
    }

    public void amethod()
    {
        System.out.println("Derived.amethod()");
    }
}

为什么这段代码打印b.i = 99而不是b.i = -1?谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-14 02:23:28

这是因为您引用的是对象的成员变量,而不是方法。因为它被声明为Base对象,所以它将使用Base.i,因为成员变量不能从提供给方法的多态性中受益。如果您将getI()方法添加到这两个类并调用它,而不是只调用b.i,那么它将按照您的预期工作。

代码语言:javascript
复制
public int getI() {
    return this.i;
}


    Base b = new Derived();
    System.out.println(b.getI());
票数 4
EN

Stack Overflow用户

发布于 2011-03-14 02:19:43

您有两个名为i的不同字段;一个在Base中,另一个在Derived中。

因为b被声明为Base,所以b.iBase类返回i字段。

您可能希望在Derived构造函数中设置i字段,而不是创建新字段。

票数 2
EN

Stack Overflow用户

发布于 2011-03-14 02:20:23

因为在本例中,b.i说的是(( Base ).i),这意味着它将引用Base的i变量,而不是派生的i。如果您使用的是b.getI(),并且每个Base和Dervid都实现了自己的getI并返回自己的i,那么它将返回-1。

来解释为什么Base调用派生的amethod。Java方法调用是动态的,并在运行时确定。在您的例子中,这里的Base b = new Derived() b的类型是派生的。Java运行时将实现b的类型,并调用最接近于派生的方法。

所以如果你有

代码语言:javascript
复制
class Base{
  int i =99;
  public int getI(){
    return i;
  } 
}
class Derived extends Base{
  int i =-1;
  public int getI(){
    return i;
  }
}

派生的getI()方法将被调用(并返回-1),即使它被定义为Base b = new Derived();

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

https://stackoverflow.com/questions/5291378

复制
相关文章

相似问题

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