Java内部类(非静态)
关于这个话题,我有一个问题:Java内部类(非静态),java,Java,关于这个话题,我有一个问题: 内部类的实例每次都需要内部类的来宾类的相同类型的对象。例如: public class GuestClass { class innerClass { } public static void main(String[] args) { innerClass test = new innerClass(); //does not work because
内部类的实例每次都需要内部类的来宾类的相同类型的对象。例如:
public class GuestClass {
class innerClass {
}
public static void main(String[] args) {
innerClass test = new innerClass(); //does not work because
//I need a object of type GuestClass
GuestClass iNeedYou = new GuestClass();
innerClass nestClassObj = iNeedYou.new innerClass(); //it works
}
}
好的,很清楚。innerClass对象现在还指向GuestClass对象(iNeedYou)
现在我的问题来了:
匿名类也是内部类,对吗?
但有些不同:
A.我不知道这个物体的类型
B.它实现了一个接口。
但它仍然是内部类(匿名但内部)的对象
事实上,如果我这样做:
public class GuestClass {
private int numb = 100;
class innerClass {
}
public void createAnAnonymusObject () {
myInterface myAnObj = new myInterface(){
int a, b;
@Override
public void print() {
System.out.println(numb); //it works
}};
myAnObj.print();
}
public static void main(String[] args) {
GuestClass iNeedYou = new GuestClass();
iNeedYou.createAnAnonymusObject();
}
}
因为匿名内部对象指向外部对象,所以工作正常。。。所以我可以看到变量numb但为什么会这样呢?
public static void main(String[] args) {
myInterface myAnObj = new myInterface(){ //why does it work? in this case
//where is the outer object?
int a, b;
@Override
public void print() {
}};
}
如果匿名类是一个内部类,为什么它不需要外部对象?这里您基本上要问两个问题 为什么非静态嵌套类需要封闭实例? 因为假定它可以访问外部类的所有非静态成员。即使您实际上没有使用其中任何一个,编译器也无法推断非静态嵌套类可以在静态上下文中安全使用。您必须显式地将其标记为static以允许此操作 在此代码段中创建的匿名类的封闭对象在何处,是什么? 在本例中,匿名类没有封闭实例。它是在静态上下文中,在
main
方法中创建的。您可以实例化MyInterface
,因为所有接口都是隐式静态的,即使是在另一个类中定义的。这就是为什么界面是可见的。另一方面,OuterClass
的所有非静态成员在此范围内不可用,因此保证不使用其中任何一个。这就是为什么不需要对封闭对象进行引用的原因。事实上,这包含在语言规范中
看看这个
假设C是被实例化的类,i是被实例化的实例
创建。如果C是一个内部类,那么我可能有一个
封闭实例。立即封闭的i实例(§8.1.3)
确定如下
如果C是匿名类,则:
- 如果类实例创建表达式发生在静态上下文中 (§8.1.3),则我没有直接封闭的实例
- 否则,立即封闭的i实例就是这个
public class Anonymous2 {
private int numb = 100;
public static void main(String[] args) {
MyInterface myAnObj = new MyInterface(){ //why it works ?? in this case
//where is the outer object?
int a, b;
@Override
public void print() {
System.out.println(numb);
}};
}
}
interface MyInterface {
public void print();
}
汇编:
C:\JavaTools>javac Anonymous2.java
Anonymous2.java:11: error: non-static variable numb cannot be referenced from a static context
System.out.println(numb);
^
1 error
可以看出,OP声称要编译的代码没有。所以整个问题都无关紧要。我理解,问题是:为什么anonymus类可以这样做,而普通的内部类不行?在这种情况下,它需要外部对象,但匿名对象不需要!为什么它们之间有这种差异?@GiovanniFar在上一个示例中不是静态变量吗?否则,它在
main
@GiovanniFar中就看不到了。我拒绝在没有看到所有代码的情况下进行推测。Tom,我完全同意。@EJP确实是一个史诗般的版本:)非常感谢你帮我找到了正确的答案。“myInterface”是什么?使用javap
工具(上次我检查时,它与JDK一起提供)会很有启发性转储这些不同测试用例生成的字节码。@EJP,因为它显然意味着接口的名称-u-,但您没有提供定义,所以我们只能猜测或推断。应该在问题中提供。@GiovanniFar我投票结束这个问题。您还没有发布所有相关的代码,而且您发布的一些代码显然不是真正的代码。你被要求多次修复,但你没有-1这样肯定不行。。。你必须以匿名的方式对myAnObj进行远程监控2object@GiovanniFar所以你发布的代码不是真正的代码?是的,但在我使用myAnObj的第一篇文章中看起来更好。。。我在哪里创作的。。。你会看到我在一个对象的方法中工作…@GiovanniFar-它证明了你原始帖子中的最后一个代码序列是伪造的-我只是复制了它并更改了类名。你问“但这为什么有效?”,答案是没有。@GiovanniFar不,显然没有。HotLicks已经证明了这一点。QED和+1
C:\JavaTools>javac Anonymous2.java
Anonymous2.java:11: error: non-static variable numb cannot be referenced from a static context
System.out.println(numb);
^
1 error