2014-02-19 30 views
2

如果匿名类被定义为接口的类型,那么匿名类将实现该接口,但是如果它被定义为另一个类的类型(如下所示),它似乎不会扩展该类(因为我是告诉它)。在Java中,匿名类与它被定义的类型有什么关系?

public class AnonymousClassTest { 

    // nested class 
    private class NestedClass { 
     String string = "Hello from nested class."; 
    } 

    // entry point 
    public static void main (String args[]){ 
     AnonymousClassTest act = new AnonymousClassTest(); 
     act.performTest(); 
    } 

    // performs the test 
    private void performTest(){ 

     // anonymous class to test 
     NestedClass anonymousClass = new NestedClass() { 
      String string = "Hello from anonymous class."; 
     }; 

     System.out.println(anonymousClass.string); 

    } 
} 

在这里,如果匿名类扩展嵌套类则放出来会是“你好,从匿名类。”,运行输出然而,当写着“你好,从嵌套类。”

+1

我想你是在你的匿名类中声明第二个字段。尝试删除字符串修饰符。让它成为string =“来自匿名类的你好。”并使字符串字段非私有。 – Others

+0

这是真的,但我试图重写匿名类中的字符串。要访问父字符串,我不应该使用'super.string'? – Continuity8

+0

啊......我现在明白了。我没有意识到这些字段是不可覆盖的;只有方法是。我正在像一个方法对待字符串字段。 – Continuity8

回答

3

字段不可覆盖。如果一个类声明了一个名为string的字段,并且子类也声明了一个名为string的字段,则有两个单独的字段,名为string。例如,这个程序:

class Parent { 
    public String string = "parent"; 
    public int getInt() { 
     return 1; 
    } 
} 

class Child extends Parent { 
    public String string = "child"; // does not override Parent.string 
    // overrides Parent.getInt(): 
    public int getInt() { 
     return 2; 
    } 
} 

public class Main { 
    public static void main(final String... args) { 
     Child child = new Child(); 
     System.out.println(child.string);   // prints "child" 
     System.out.println(child.getInt());   // prints "2" 
     Parent childAsParent = child; 
     System.out.println(childAsParent.string); // prints "parent" (no override) 
     System.out.println(childAsParent.getInt()); // prints "2" (yes override) 
    } 
} 

打印

child 
2 
parent 
2 

因为childAsParent有类型Parent,所以指Parent声明的字段,即使实际实例具有运行时类型Child

因此,如果您修改演示文稿以使用方法而不是字段,则会看到您期待的结果。

+0

啊,我明白了,谢谢!我像对待方法一样对待这个领域。那么为了澄清这个匿名类是否扩展了用于定义它的类型呢?但是,因为它被定义为父类型,所以访问该字段将访问父类的实例。 – Continuity8

+1

@JonathanWhite:回复:第一个问题:是的。回复:第二个问题:如果我正确理解你,那么 - 不完全是。例如,'System.out.println(new NestedClass(){String string =“Hello from anonymous class。”;} .string);'将会打印''来自匿名类的Hello','',因为它会得到'string'从一个表达式的类型是匿名类。你的'anonymousClass.string'是''Hello嵌套类'的原因''是你的表达式'anonymousClass'具有'NestedClass'类型。你明白我的意思吗? – ruakh

+0

是的,我得到你,谢谢! – Continuity8