为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

海绵宝宝撒 2022-07-20 10:11:53
如果我有如下三个类: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。
查看完整描述

2 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

如果您在子类中引入新字段,请不要重复使用父类中的字段名称。你一无所获,只有困惑和问题。


如果我理解正确,您希望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.


查看完整回答
反对 回复 2022-07-20
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

表达式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);

这是有效的,因为变量访问是静态绑定的。变量或表达式的类型决定了搜索变量访问的范围。


查看完整回答
反对 回复 2022-07-20
  • 2 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信