无法访问匿名嵌套子类的成员(实现接口)

时间:2014-12-10 04:09:54

标签: java class interface inner-classes

我这里有问题。我写了一段这样的代码:

package vh.Static;

public class Nesting {
    //static class Nested{}
    class Inner{}
    void method(){
        Inner inner = new Inner(){
            public int z =2;
            public int getZ(){
                return z;
            }
        };
        System.out.println(inner);
    }
    public static void main(String args[]){
        Nesting ne  =new Nesting();
        Inner inner = ne.new Inner(){
            public int z =1;
            public int getZ(){
                return z;
            }
        };
        System.out.println(inner);
        ne.method();
   }
}

我不知道如何在Inner构造函数块中获取var z definding。请帮帮我! 并告诉我z在哪里?在内心?或嵌套

1 个答案:

答案 0 :(得分:0)

您问题的原始标题的答案非常广泛 - 您需要做一些研究:

但要在代码中解决您的具体示例:

void method(){
    Inner inner = new Inner(){
        public int z =2;
        public int getZ(){
            return z;
        }
    };
}

这将实例化嵌套类Inner的新匿名子类,然后使用公共字段和方法扩展匿名子类。

无法访问扩展字段+方法的原因是变量inner属于基类型Inner(没有添加任何内容 - 这被简单地定义为{{ 1}}),并且不是匿名子类的类型。就目前而言,您需要求助于像反射这样的恶意访问匿名子类本身之外的匿名子类中的字段+属性。

class Inner{}

可以做的是在 System.out.println(inner.getZ()); // Does not compile 上定义抽象方法,然后在匿名类中覆盖它们:

Inner

现在,您可以在abstract class Inner{ public abstract int getZ(); } void method(){ Inner inner = new Inner(){ private int z =2; // Private fields plz, use get / setters public int getZ(){ return z; } };

中的任意位置访问已定义的Inner方法

只有一条关于约定的说明 - the docs将内部类(您的Nesting)称为Inner,将外部类(您的nested class)称为{{ 1}}。

Nesting定义为接口,然后以匿名方式实现,这是同样的事情:

Outer