3

我想访问x超类中的实例变量。我找不到它的语法。这甚至可能吗?

public class SuperBoss {
    int x = 10;
}

public class Boss extends SuperBoss {
    int x = 2;

public static void main ( String[] args ) {
    Boss b = new Boss();
    System.out.println(b.x); //prints out 2, I want it to print out 10 
}

我一直在尝试使用关键字“super”,但没有成功。

4

6 回答 6

4

它打印出来2是因为您的int x = 2in声明隐藏了inBoss的声明xSuperBoss

通常,您会使用super关键字显式访问超类的字段,但这在 main 方法public的上下文中不起作用。static您可以定义一个小的帮助函数,它将为您获取超类的值x

public class Boss extends SuperBoss {
    int x = 2;

    public int getSuperX() {
        return super.x;
    }

    public static void main ( String[] args ) {
       Boss b = new Boss();
       System.out.println(b.getSuperX()); //prints out 2, I want it to print out 10 
    }
}
于 2013-04-28T23:32:21.813 回答
2

据我所知(我可能应该在 JLS 中查看详细信息),使用 访问影子非私有字段是合法的super,但只能从实例方法中访问。所以你可以这样做:

public class Boss extends SuperBoss {

    int x = 2;

    int getSuperX() {
        return super.x;
    }

    public static void main (String[] args) {
        Boss b = new Boss();
        System.out.println(b.getSuperX());
    }

}
于 2013-04-28T23:39:10.997 回答
1

在你的类中添加getSuperX()方法:Boss

public class Boss extends SuperBoss {

    int x = 2;

    public int getSuperX() {
        return super.x;
    }

    public static void main(String[] args) {
        Boss b = new Boss();
        System.out.println(b.getSuperX());
    }
}
于 2013-04-28T23:39:30.023 回答
0

发生的事情是Boss的实例变量将同名的实例变量隐藏在SuperBoss. 您可以暂时将您的实例转换为超类型类:

public static void main ( String[] args ) {
    Boss boss = new Boss();
    SuperBoss superBoss = boss;
    System.out.println(boss.x); //prints 2
    System.out.println(superBoss.x); //prints 10 
}

不建议这样做。出于封装原因,您的实例变量不应该是可见的,即。应该是私有的/受保护的。并且可能不应该与父类中的变量同名。

于 2013-04-28T23:39:31.620 回答
0

要做你想做的事,你需要在超类中声明xprotected而不是试图在子类中覆盖它:

public class SuperBoss {
    protected int x = 10;
}

public class Boss extends SuperBoss {
    // int x = 2;

    public static void main ( String[] args ) {
        Boss b = new Boss();
        System.out.println(b.x);
    }
}

然而,在实践中,几乎不需要protected数据。它可能导致几乎与数据一样多的问题public。更好的是:

public class SuperBoss {
    private int x = 10;

    protected int getX() {
        return x;
    }
}

public class Boss extends SuperBoss {
    // int x = 2;

    public static void main ( String[] args ) {
        Boss b = new Boss();
        System.out.println(b.getX());
    }
}
于 2013-04-28T23:46:23.933 回答
0

是的,有办法。字段具有编译时绑定。您需要的是 SuperBoss 的演员表:

public class SuperBoss {
    int x = 10;
}

public class Boss extends SuperBoss {
    int x = 2;

    public static void main ( String[] args ) {
        Boss b = new Boss();
        System.out.println(((SuperBoss)b).x);
    }
}
于 2013-04-28T23:47:11.647 回答