我想访问超类中的实例变量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”而没有成功。
答案 0 :(得分:4)
打印出2
,因为int x = 2
中Boss
的声明隐藏 x
中SuperBoss
的声明< / p>
通常,您会使用super
关键字显式访问超类的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
}
}
答案 1 :(得分: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());
}
}
答案 2 :(得分: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());
}
}
答案 3 :(得分: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
}
不建议这样做。出于封装原因,您的实例变量不应该是可见的,即。应该是私人/受保护的。并且可能不应该与父类中的变量具有相同的名称。
答案 4 :(得分:0)
要做你想做的事,你需要在超类中声明x
为protected
,而不是试图在子类中覆盖它:
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());
}
}
答案 5 :(得分:0)
是的,有办法。 Fields具有编译时绑定。你需要的是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);
}
}