繁体   English   中英

Java中的匿名内部类(摘自Java第四版的Thought)

[英]Anonymous inner classes in Java (from Thinking in Java 4th edition)

我开始学习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);
}

}

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

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

您得到的错误意味着编译器找不到Small类的声明。 确保已正确导入该类,或者该类具有正确的声明和/或位于与主类相同的包中。

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

您不能只使用匿名类从头开始创建类标识符 匿名类假定您正在扩展或实现另一个类或接口。 但是您可以执行以下操作;

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引用中,并且您只能从中调用对象方法。

我希望这有帮助。


进一步阅读;

语法

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() {};
    }

    ...
}

另一个类中的一个类,该类将不提供类名,即该类是Java中的Anonymous内部

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM