Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在实践中使用内部类_Java_Inner Classes_Anonymous Inner Class - Fatal编程技术网

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,但可以直接从其名称中看到:
      new ScreenCapture.CaptureButtonListener(screenCaptureInstance)
      它与ScreenCapture类相关(这提高了代码的可读性)
    现在您可能想知道为什么要创建一个不能访问其所有者字段的内部类?您是对的:在我们的例子中,这不是很明智,因为您必须将屏幕捕获的实例传递给构造函数(因此您不能将其用于屏幕捕获以外的任何其他类)。这只是为了证明两者的区别

    以下示例将给出前一个示例的全部含义:

    您可以在屏幕截图中将侦听器声明为公共静态接口

    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以查看其用法。

    一个示例是实现自定义的
    比较器。