Java 超类类型变量能否引用子类对象?
例如:Java 超类类型变量能否引用子类对象?,java,object,Java,Object,例如: public class A { public class B extends A { } public static void main(String[] args) { A a; a = new B(); } } 我搜索了一些类似的问题,结果显示“是的,超类类型变量可以引用子类对象”。但在eclipse中,上面的代码出现了一个错误,如“没有可访问的类型A的封闭实例。必须使用类型A的封闭实例限定分配(例如x.new A(),其中x是A的实例)。” 那怎么了?谢谢
public class A {
public class B extends A {
}
public static void main(String[] args) {
A a;
a = new B();
}
}
我搜索了一些类似的问题,结果显示“是的,超类类型变量可以引用子类对象”。但在eclipse中,上面的代码出现了一个错误,如“没有可访问的类型A的封闭实例。必须使用类型A的封闭实例限定分配(例如x.new A(),其中x是A的实例)。”
那怎么了?谢谢 检查你的妄想!!应该是:
class A {
}
public class B extends A {
public static void main(String[] args) {
A a;
a = new B();
}
}
您的代码中还有两个
public
类 检查你的妄想!!应该是:
class A {
}
public class B extends A {
public static void main(String[] args) {
A a;
a = new B();
}
}
您的代码中还有两个public
类 答案是“是”超类可以引用子类,但你问错了问题
出现此错误是因为B
是A
的封闭类(意味着您必须有A
的实例才能有B
的实例),但您是从静态方法引用它(即不是A
的实例)
只需将B
更改为static
类
public class A {
public static class B extends A { // <-- Added static keyword
}
public static void main(String[] args) {
A a;
a = new B();
}
}
答案是“是”超类可以引用子类,但你问错了问题
出现此错误是因为B
是A
的封闭类(意味着您必须有A
的实例才能有B
的实例),但您是从静态方法引用它(即不是A
的实例)
只需将B
更改为static
类
public class A {
public static class B extends A { // <-- Added static keyword
}
public static void main(String[] args) {
A a;
a = new B();
}
}
您已更改代码,因此
main()
位于B
中,但问题是关于A
中的代码。有关正确的解释,请参阅我的答案。@user1429807:twopublic
类不能在同一个文件中。如果要将两个都公开
,可以将它们放在两个不同的文件中,或者将其中一个设为默认值
。再次。。。看看我的答案。我只在一个地方给他的代码添加了关键字static
,没有做任何其他更改,瞧,问题解决了。顺便说一句,我建议你确实阅读我的答案。你最后的评论表明你没有这样做,否则你就不会对两个公共类(问题中的代码没有)发表不相关的评论@Bohemian:yup。。读了就明白了!!我把它误认为是妄想症的问题。。。我的错!!顺便说一句,我添加了一个您可能感兴趣的替代解决方案,其中B
作为一个封闭类保留。您已经更改了代码,以便main()
位于B
中,但问题是关于A
中的代码。有关正确的解释,请参阅我的答案。@user1429807:twopublic
类不能在同一个文件中。如果要将两个都公开
,可以将它们放在两个不同的文件中,或者将其中一个设为默认值
。再次。。。看看我的答案。我只在一个地方给他的代码添加了关键字static
,没有做任何其他更改,瞧,问题解决了。顺便说一句,我建议你确实阅读我的答案。你最后的评论表明你没有这样做,否则你就不会对两个公共类(问题中的代码没有)发表不相关的评论@Bohemian:yup。。读了就明白了!!我把它误认为是妄想症的问题。。。我的错!!顺便说一句,我添加了一个您可能感兴趣的替代解决方案,其中B
作为一个附件class@user1429807请注意另一种同样有效的错误解决方案。您可能会发现语法很有启发性。请确认一下,这是否会导致出现NullPointerException
?也就是说,你不需要一个非null
的a
实例来实例化B
的实例吗?@SimonC它肯定会爆炸。我从A编辑了这个问题代码>到A A=新A()
。谢谢你注意到这一点@user1429807请注意错误的替代解决方案,该解决方案同样有效。您可能会发现语法很有启发性。请确认一下,这是否会导致出现NullPointerException
?也就是说,你不需要一个非null
的a
实例来实例化B
的实例吗?@SimonC它肯定会爆炸。我从A编辑了这个问题代码>到A A=新A()
。谢谢你注意到这一点!可能的重复可能的重复