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:two
public
类不能在同一个文件中。如果要将两个
都公开
,可以将它们放在两个不同的文件中,或者将其中一个
设为默认值
。再次。。。看看我的答案。我只在一个地方给他的代码添加了关键字
static
,没有做任何其他更改,瞧,问题解决了。顺便说一句,我建议你确实阅读我的答案。你最后的评论表明你没有这样做,否则你就不会对两个公共类(问题中的代码没有)发表不相关的评论@Bohemian:yup。。读了就明白了!!我把它误认为是妄想症的问题。。。我的错!!顺便说一句,我添加了一个您可能感兴趣的替代解决方案,其中
B
作为一个封闭类保留。您已经更改了代码,以便
main()
位于
B
中,但问题是关于
A
中的代码。有关正确的解释,请参阅我的答案。@user1429807:two
public
类不能在同一个文件中。如果要将两个
都公开
,可以将它们放在两个不同的文件中,或者将其中一个
设为默认值
。再次。。。看看我的答案。我只在一个地方给他的代码添加了关键字
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()
。谢谢你注意到这一点!可能的重复可能的重复