Java 如何在实践中使用内部类
为什么有人会使用Java 如何在实践中使用内部类,java,inner-classes,anonymous-inner-class,Java,Inner Classes,Anonymous Inner Class,为什么有人会使用内部类?同样的功能可以通过本地类或子类实现 还可以举个例子。内部类的作用域是声明它们的类,因此根据您的作用域,您将决定创建一个内部类。是的,如果您的作用域是方法的局部,那么您可以创建局部类,所以决策是由作用域驱动的 我建议阅读下面的内容以获得更多的理解和知识内部类可以在许多函数情况下使用。它们有两个优点: 内部类可以看到外部类的字段(如果它不是静态的)。这意味着您不必像处理外部类字段一样处理外部类字段。这意味着内部类需要外部类的实例才能工作。 如果您的类是静态的,那么它的行为就像
内部类
?同样的功能可以通过本地类
或子类
实现
还可以举个例子。内部类的作用域是声明它们的类,因此根据您的作用域,您将决定创建一个内部类。是的,如果您的作用域是方法的局部,那么您可以创建局部类,所以决策是由作用域驱动的
我建议阅读下面的内容以获得更多的理解和知识内部类可以在许多函数情况下使用。它们有两个优点:
class ScreenCapture {
class CaptureButtonListener implements ClickListener {
public void onClick( ClickEvent click ) {
//..capture
pressCount++;
}
}
Button button = new Button("capture");
int pressCount = 0;
void addListeners() {
button.addClickListener( new CaptureButtonListener() );
}
}
如你所见:
- 在屏幕截图之外,您永远不需要CaptureButtonListener。所以最好隐藏它(甚至声明它是私有的或受保护的)
- 内部类正在访问不属于它的字段:pressCount。这是可能的,因为它的实例绑定到屏幕捕获实例:您不能在静态方法中创建
:您必须在实例方法中使用它新CaptureButtonListener()
public class ScreenCapture {
public static class CaptureButtonListener implements ClickListener {
protected ScreenCapture controller;
public CaptureButtonListener( ScreenCapture controller ) {
this.controller = controller;
}
public void onClick( ClickEvent click ) {
//..capture
controller.pressCount++;
}
}
Button button = new Button("capture");
int pressCount = 0;
public void captureRequested() {
//do capture...
pressCount++;
}
void addListeners() {
button.addClickListener( new CaptureButtonListener(this) );
}
}
请注意,在这种情况下:
- 变量pressCount不再可以从内部类访问:您必须指定它所属的实例
- 您可以从外部实例化CaptureButtonListener,但可以直接从其名称中看到:
它与ScreenCapture类相关(这提高了代码的可读性)new ScreenCapture.CaptureButtonListener(screenCaptureInstance)
class ScreenCapture {
public static interface class CaptureRequestListener {
public void captureRequested( ClickEvent click );
}
}
通过这种方式,您可以传递“如何处理捕获请求”的屏幕捕获实现
同样,接口的实现将知道它们正在实现特定于屏幕捕获的东西,因为它们将实现
public class MyImpl implements ScreenCapture.CaptureRequestListener {
public void captureRequested( ClickEvent click ) {
// I will count requests instead
}
}
因此,您的代码比将其按文件组织放在单独的类中更清晰
您还可以有一个基本处理类(作为内部类的常见任务的抽象实现)
我希望一切都清楚:-)
顺致敬意,
Zied内部类可以用来实现多重继承。所以,如果您的类已经扩展了一个类,那么您可以通过内部类扩展更多的类
您还应该检查集合API以查看其用法。一个示例是实现自定义的
比较器。