
[英]Java: Could someone explain this from “Thinking in Java 4th edition”?
[英]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 implementing
的interface that you are implementing
或class 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.