首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个程序打印25?(Java继承)

为什么这个程序打印25?(Java继承)
EN

Stack Overflow用户
提问于 2014-10-20 12:51:53
回答 4查看 69关注 0票数 0

在这个程序中

代码语言:javascript
复制
class a
{
     int a=25;
    public void aa()
    {
        System.out.println(a);  
    }

}
class b extends a
{
    int a=2;
    public static void main(String[] args) {
        b x=new b();
        x.aa();

    }
}

为什么"x.aa()“打印25个ans,为什么不打印2个?背后的原因是什么?

代码语言:javascript
复制
class a
{
     int a=25;
    public void aa()
    {
        System.out.println(a);  
        b();
    }
    public void b()
    {
        System.out.println("this should print");
    }

}
class b extends a
{
    int a=2;
    public static void main(String[] args) {
        b x=new b();
        x.aa();

    }
    public void b()
    {
        System.out.println("this should not print");
    }
}

如果我们考虑上面的输出,那么在这里上面的b()的输出应该打印"this we print“,但我们从sublcass得到的输出是"this not print”。

EN

回答 4

Stack Overflow用户

发布于 2014-10-20 12:57:34

类b继承了类A,所以当你调用x.aa时,它调用的是类a的方法aa。a类的成员a被初始化为25,所以它输出25。类A不知道类b的成员A。

票数 1
EN

Stack Overflow用户

发布于 2014-10-20 13:09:06

字段不能被重写,并且不是虚拟字段。B.a*独立于A.a,以至于它们实际上可以有不同的类型。B没有办法让A意识到B.a而不是A.aB的实例实际上有两个名为a的字段,但其中一个被另一个隐藏(“隐藏”)。(如果需要,代码B可以通过编写((A)this).a来引用其A.a字段。这是因为选择适当的a是基于((A)this)的类型,即A,而不是实例的运行时类型,即BB的子类型。)

*注意:我已经将您的类重命名为AB:根据Java命名约定,类名称以大写字母开头。

票数 1
EN

Stack Overflow用户

发布于 2014-10-20 13:14:13

代码语言:javascript
复制
b x=new b();

当你要这样做的时候,这将打印出构造函数的输出,因为它显然是构造b类的对象,而在那个类中的A类中,b()充当方法,所以当你创建b类的对象时,它不会调用。

而在这种情况下

代码语言:javascript
复制
b x=new b();
x.aa();

这将在默认情况下调用继承,并在您获得输出时打印出来。还有一件事。

代码语言:javascript
复制
 public void aa()
    {
        System.out.println(a);  
    }

在这种情况下,它将使用该特定类的局部变量,因此它将打印您在该类上定义的任何内容。在您的例子中,就是a=25;

顺便说一句,问得好。

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

https://stackoverflow.com/questions/26458756

复制
相关文章

相似问题

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