2012-06-01 86 views
1

例如:超类型变量是否可以引用子类对象?

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的实例)”。

那么有什么不对?谢谢!

+0

[爪哇 - 类型的无封闭情况foo是接近]的可能的复制(http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – fabian

回答

-2

检查你的禁忌!它应该是:

class A { 
} 
public class B extends A { 


public static void main(String[] args) { 
    A a; 
    a = new B(); 
} 

} 

而且你有两个public班在你的代码!

+0

你已经改变了代码,使'main()'在'B'中,但问题是关于'A'中的代码。看到我的答案是正确的解释。 – Bohemian

+0

@ user1429807:两个'public'类不能在同一个文件中。如果你想让它们保持两种不同的文件,你可以将它们放在两个不同的文件中**或**使其中的一个成为'default'。 – WickeD

+0

再次......看到我的答案。我添加的所有内容都是在他的代码中的关键字'静态'在一个地方,并没有做出其他更改,瞧,问题解决了。我建议你其实*阅读*我的答案btw。你最后的评论表明你还没有这样做,否则你不会做出你关于两个公共类的不相关的评论(这个问题中的代码不**有**) – Bohemian

3

答案是“是”超类可以引用一个子类,但是你问的是错误的问题。

你得到这个错误,因为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(); 
    } 
} 

没有错误。

另一种选择是把它封闭类和做到这一点:

public class A { 

    public class B extends A { // leave B as an enclosed class 
    } 

    public static void main(String[] args) { 
     A a = new A(); 
     a = a.new B(); // can only create a B in the context of an A 
    } 
} 
+0

我明白了!非常感谢! :) – Echo

+0

@ user1429807请注意您的错误的替代解决方案,同样有效。您可能会发现语法有启发性。 – Bohemian

+1

只是为了确认,是不是会导致'NullPointerException'这样的结果呢?即你不需要'A'的非'null'实例来实例化'B'的实例吗? – SimonC

相关问题