Java中的匿名内部类(来自Thinking in Java第4版)

时间:2014-06-27 09:27:10

标签: java

我开始学习Java,第2行出现错误:" Small无法解析为类型"。为什么呢?

public class Big {
public Small getSmall() {
    return new Small() {
        void out() {
            System.out.println("Big Small out()");
        }
    };
}

public static void main(String[] args) {
    Big b = new Big();
    Small s = b.getSmall();
    s.out();
    System.exit(0);
}

}

5 个答案:

答案 0 :(得分:3)

public Small getSmall() {
    return new Small() {
        void out() {
            System.out.println("Big Small out()");
        }
    };
}

似乎没有什么误解。声明匿名内部类时,假定Small为interface that you are implementingclass that you are extending。因此,如果您已经拥有Small类或接口,则需要导入它。如果没有创建一个。

答案 1 :(得分:0)

您获得的错误意味着编译器无法找到Small类的声明。确保您已正确导入此类,或者此类具有适当的声明和/或位于主类所在的同一个包中。

答案 2 :(得分:0)

匿名类扩展/实现其他类/接口

您无法使用匿名类从头开始创建类标识符。匿名类假定您正在扩展或实现另一个类或接口。但你可以做以下事情;

abstract class Small {} // Small declared here

public class Big {
    public Small getSmall() {
        // Create and return an anonymous class that extends Small.
        return new Small() {
            void out() {
                System.out.println("Big Small out()");
            }
        };
    }

    public static void main(String[] args) {
        Big b = new Big();
        Small s = b.getSmall();
        // Compile error below! Your Small reference doesn't know about out()
        s.out(); 
        System.exit(0);
    }
}   

当您创建匿名Small类时,您正在创建一个扩展 Small的新(匿名)类。在上面的示例中,您将注意到抽象类Small没有out()方法。即使你可以在匿名声明中添加它,你也永远无法调用它,因为你仍然需要在Small引用变量中保存新的匿名类。

或者,您可以创建一个扩展Object的匿名类。但是它必须保存在Object引用中,你只能从它调用对象方法。

我希望这会有所帮助。


进一步阅读;

答案 3 :(得分:0)

语法

return new Small() {
    void out() {
        System.out.println("Big Small out()");
    }
};

可以被想象(粗略地)作为

的简短形式
return new SmallWithOut();

有一个类

class SmallWithOut extends Small {
    void out() {
        System.out.println("Big Small out()");
    }
}

你也可以把它翻译成单词

  

创建一个类的新实例,该类是类Small的子类(使用此out()方法...)

问题在于您根本没有声明类Small。所以应该在那里扩展的类根本就不知道。

有几种方法可以编译它。最简单的是在本地添加类作为内部类(甚至是接口)

public class Big
{
    private static class Small
    {
        void out() {};
    }

    ...
}

答案 4 :(得分:-1)

另一个类中的类,该类不提供类名,即该类是a java中的匿名内部