繁体   English   中英

为什么该程序打印25? (Java继承)

[英]Why is this program printing 25? (Java inheritance)

在这个程序中

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?为什么呢?

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 should print”,但是我们从sublcass获取输出“ this not print”

类b继承了类A,因此,当您调用x.aa时,它正在调用类a的方法aa。 类a的成员a用25初始化,因此它输出25。类a不知道类b的成员a。

字段不能被覆盖,并且不是虚拟的。 Ba *独立于Aa ,以至于它们实际上可以具有不同的类型。 B无法使A代替Aa来意识到Ba B实例实际上将有两个名为a字段,但一个被另一个隐藏(“阴影”)。 (如果需要的话,代码B可以参考它Aa通过写入字段((A)this).a ,这是因为相应的a基于的类型被选择((A)this) ,它是A ,而不是运行时类型的实例,这将是B或的子类型B )。

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

b x=new b();

在执行此操作时,这将打印出构造函数的内容作为其给定值,因为它清楚地使b类成为对象,而在该类中的类A的情况下, b()作为方法,因此在您使用时不会调用使b类成为对象。

而在

b x=new b();
x.aa();

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

 public void aa()
    {
        System.out.println(a);  
    }

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

顺便问一个好问题。

方法aa()是类a的成员。 因此,方法aa()可以查看/访问类a的实例成员。 现在,您已经继承了类a到b。 这意味着类b的对象可以访问/调用aa()。 但是,这并不意味着允许aa()访问类b的变量a。 这就是为什么方法aa()打印自己类的变量a并打印25。

现在有关您的第二个程序。 在类b中,您将重写方法b()。 在调用重写的方法时,方法的选择(无论是从子类还是从超类)是基于调用对象(分别是子类还是超类)的实例进行的。 您已经使用类b的实例调用方法aa(),这就是为什么要调用类b的方法b()的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM