Java超类变量在子类之外访问?

如果我有如下三个类:


package com.Bob.Marley;

public class SuperClass{

     protected int x = 0;

}


package com.Bob.Marley;

public class SubClass extends SuperClass{

    protected int x = 1;

}


package com.Bob.Marley;

public class TestClass{

    public static void main (String[] args){

        SubClass s = new SubClass();

        //print 1

        System.out.println(s.x);

        //how do I print the superclass variable?

        //I know inside SubClass I can access it with plain old super.x

        //but what about outside the subclass with a new object. 

    }

}

所以问题是我如何从在单独的类中创建的新对象的超类中打印出 0 。System.out.println(s.super.x); 不起作用。我认为它不会改变任何东西,但我使用的是 java 8。


海绵宝宝撒
浏览 145回答 2
2回答

慕虎7371278

如果您在子类中引入新字段,请不要重复使用父类中的字段名称。你一无所获,只有困惑和问题。如果我理解正确,您希望SubClass实例有两个字段,一个继承自SuperClass(为了讨论,让我们将其重命名为superX以使事情更清楚),另一个来自子类本身(让我们将其重命名为subX)。对于给定的SubClass实例,您希望能够访问这两个字段,superX并且subX(当然,使用不同的表达式)。在您的代码示例中使事情变得困难的是,您选择为它们两个赋予相同的名称x。因此,如果您真的希望您的实例同时携带这两个字段,我建议您重命名它们,这样您就不必使用诸如强制转换为SuperClass.public class SuperClass{     protected int superX = 0;}public class SubClass extends SuperClass{    protected int subX = 1;}但是,如果x对于父类和子类都代表同一个属性,具有相同的含义,只是初始值不同,那么拥有两个不同的字段是没有意义的,您应该将代码更改为:public class SuperClass{     protected int x = 0;}public class SubClass extends SuperClass{    // constructor initializes the x field with 1.    public SubClass(){        x = 1;    }}当然,那么不可能从SubClass.

开心每一天1111

表达式s.super.x在这里无效。每当你在 a 前面super.x加上一些东西时,它应该是一个类型名,而不是一个变量名,例如SuperClass.super.x. 但是,这仅在用于访问封闭类的超类的子类内部有效,此处不存在。转换x为 aSuperClass以便您可以访问x声明的 in Superclass。System.out.println( ((SuperClass) s).x);或者SuperClass sc = (SuperClass) s;System.out.println(sc.x);这是有效的,因为变量访问是静态绑定的。变量或表达式的类型决定了搜索变量访问的范围。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java