Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内部类(非静态)_Java - Fatal编程技术网

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