[英]How to override instance variables/methods in main?
我想访问超类中的实例变量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
}
我一直试图使用关键字“超级”但没有成功。
它输出2
因为你在Boss
声明int x = 2
隐藏了SuperBoss
中x
的声明
通常,您将使用super
关键字显式访问超类的public
字段,但这不会起作用于main方法的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
}
}
据我所知(我应该在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());
}
}
在Boss
类中添加getSuperX()
方法:
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());
}
}
发生的事情是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
}
不建议这样做。 出于封装原因,您的实例变量不应该是可见的,即。 应该是私人/受保护的。 并且可能不应该与父类中的变量具有相同的名称。
要做你想做的事,你需要在超类中声明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());
}
}
是的,有一种方法。 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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.