为什么我不能在扩展类中创建一个与内部类名称相同的对象
我试图找出为什么下面的代码给出错误,请任何人都可以解释。 这里是一类为什么我不能在扩展类中创建一个与内部类名称相同的对象
package abc;
public class A {
public class B {
}
}
现在,我尝试创建一个B级
package xyz;
import abc.*;
public class B extends A{
public static void main(String[] args) {
B b = new B(); // this line gives error. Can you please explain
}
}
请考虑B类延伸的是默认包是指
import abc.*;
public class B extends A{
public static void main(String[] args) {
B b = new B(); // this line gives error. Can you please explain
// I am try to create "B" class object which extends A
//.. not the B inner class
}
}
错误显示日食是:“不能包含类型A的封闭实例,必须使用包含类型A的实例来限定分配(egxnew A(),其中x是A的一个实例)”。
鉴于B
延伸A
和A
包含内部类B
,我怀疑有混乱的空间(编译器和程序员)。
线:
B b = new B();
是不明确的。 其中 B是这个吗?正如其他地方指出的那样,内部类B需要一个包含A
的实例,所以我怀疑你的意思是B
外部类。
编辑:你的错误
“A型无封闭情况下进行访问必须符合A型的egxnew A()的类实例(其中 x是一个实例 分配。的A)“。
证实了这一点。我认为你想要xyz.B
,并应适当的范围。
尝试指定的封闭范围:
B b = new A.B();
或
B b = new xyz.B();
如果您public class B
static
,它会工作作为写。因为非静态内部类需要一个指向其外部类的“this”的指针(在B内,你可以写this.A
,而且这将会在类的实例之外)实际上是指封闭的A)。
当我在Eclipse中创建如下:
package com.example;
public class A {
class B {
}
}
和
package com.example;
import com.example.A.B;
public class B extends A {
public static void main(String[] args) {
B b = new B();
}
}
正如你所看到的Eclipse导入类A.B
。如果没有导入,请注意以下错误:
没有可以访问类型A的封闭实例。必须使用一个封闭的A型实例来限定分配(例如x.new A(),其中x是A的一个实例)。
当我尝试编译此代码(减去软件包规格,因为它们看起来不相关)时得到的错误是“非静态变量,无法从静态上下文中引用”。所以,问题是,在静态方法main()
你试图访问一些非静态的,我猜是内部类B的定义。
如果第二个外部类有一个实际上,你实际上会得到相同的错误不同的名字。所以明显的命名冲突是一个红色的鲱鱼。尽管这本身不是两个类都使用相同名称的好理由 - 但在尝试理解错误时会引起混淆。
如果我将内部类的声明更改为静态,则会解决错误。
public class A {
public static class B {
}
}
的静态还是非静态内部类相关的一些讨论here。
但这可能不是正确的修复方法。它显示main()
中的代码引用了B
内部类,而不是包含该方法的B
类。你究竟想要什么?显然,我建议为这两个类使用不同的名称以避免混淆。如果你想在main()
中创建一个包含该方法的类的实例,那么使用该类的唯一名称将解决您的问题。
你的类B extends A
继承了类A.B
和表达new B()
指内部类。因此它要求一个封闭的实例。您必须明确限定您提及的B
与包名称,或者更好的是,首先避免这样的命名混乱。
我发现这个解决方案,通过反射你可以创建B类(B扩展A类)对象。
import java.lang.reflect.Method;
import abc.*;
public class B extends A{
public static void main(String[] args) {
//B b = new B(); // this line gives error. Can you please explain
// I am try to create "B" class object which extends A
//.. not the B inner class
try{
Class c = Class.forName("B"); //class B extends A
Method m=c.getMethod("print", null);
m.invoke(c.newInstance(), null);
}catch(Exception e){
e.printStackTrace();
}
}
public void print(){
System.out.println("Printed");
}
}
请发表您的错误。 – Baz 2012-08-02 13:41:01
错误究竟是什么?这里的类型没有问题,你可能试图调用一个不存在的构造函数。 – 2012-08-02 13:41:32
如果你发布错误,它会像“封装类实例所需”。请参阅我的解答。 – tucuxi 2012-08-02 13:46:50