簡體   English   中英

Java內部類擴展了外部類

[英]Java Inner Class extends Outer Class

Java中存在一些內部類擴展外部類的情況。

例如,java.awt.geom.Arc2D.Float是java.awt.geom.Arc2D的內部類,並且還擴展了Arc2D。 (參見http://download.oracle.com/javase/6/docs/api/java/awt/geom/Arc2D.Float.html

此外,sun.org.mozilla.javascript.internal.FunctionNode.Jump擴展了sun.org.mozilla.javascript.internal.Node,它是FunctionNode的超類。 (抱歉......找不到javadoc的鏈接)

對我來說,這似乎很奇怪。 你能創建這些嗎?

new Arc2D.Float.Float() //n.b. I couldn't get this to compile in Intellij IDEA;

new FunctionNode.Jump.Jump.Jump(1); // I could get this to compile

將子類嵌套為超類的內部類有什么作用?

我想知道是否要訪問超類中的某些東西,但是如果你想訪問父類中的任何變量/方法,你可以使用

super.variable;

要么

super.method();

編輯1:jjnguy建議將邏輯保持在同一個地方。 在這種情況下,為什么不寫一個文件com.mypackage.AbstractTest:

abstract class AbstractTest {
  abstract String getString();
}

class ExtensionTest extends AbstractTest {
  @Override
  String getString() {
    return "hello world";
  }
}

... 而不是:

abstract class AbstractTest {
  abstract String getString();

  class ExtensionTest extends AbstractTest {
    @Override
    String getString() {
      return "hello world";
    }
  }
}

編輯2:正確地指出我之前編輯中的建議存在缺陷,因為無法在包之外構建ExtensionTest。 但是,周末我對此有了進一步的考慮,那么下面呢:

abstract class Test {
  public class ExtensionTest extends AbstractTest {
    @Override
    String getString() {
      return "hello world";
    }
  }

  private abstract class AbstractTest {
    abstract String getString();
  }
} 

本質上,到目前為止我看到的最好的答案是內部類擴展其外部類允許將邏輯組合在一起。 但是,我認為這可以在沒有擴展的情況下完成。

在我看來,擁有一個可以在其中嵌套無數個相同子類的類似乎是糟糕的設計。 (上下文:這是在嘗試為代碼完成實用程序生成字典時出現的,並拋出了一個StackOverflowException。我找到了一個解決方法,但我無法理解為什么它是這樣設計的。)

看看Java的Point2D 它有兩個內部類,它們是它的子類。

需要注意的重要一點是它們是static內部類。 這與普通的內部階級完全不同。 就像靜態方法一樣,靜態類是在類級而不是對象級定義的。

Point2D情況下,完成邏輯耦合類及其邏輯。 它幫助abstract類型Point2D的用戶找到他們可以使用的實現。

為了回應你的編輯,我想指出一個重要的事實。 單個Java文件只能包含一個公共類,公共內部類除外 雖然您的兩個示例都可以編譯,但它們不允許向公眾訪問這些類。 如果要在單個文件中向某人提供多個公共類,則必須使用公共靜態內部類。

內部類有兩種情況:

  • 靜態內部類。 該內部類保留參照外類。

  • 非靜態內部類。 內部類確實保留了對外部類的引用。

擴展外部類的靜態內部類的情況不像擴展外部類的非靜態內部類那樣有趣。

后者會發生什么:創建內部類,需要引用外部類。 但是,由於內部類是外部類的實例,因此它還接受對內部類的另一個實例的引用,以用作外部類。

我們來看一些代碼:

Outer a = new Outer();
Outer.Inner b = a.new Inner();

// Only possible when Inner extends Outer:
Outer.Inner c = a.new Inner().new Inner();

如果您知道構建器模式 ,則可以使用它來獲得它的OOP版本:

public abstract class Command {

    // Not possible to create the command, else than from this file!
    private Command() {
    }

    public abstract void perform();

    public static class StartComputer extends Command {
        public void perform() {
            System.out.println("Starting Computer");
        }
    }

    public class OpenNotepad extends Command {
        public void perform() {
            Command.this.perform();
            System.out.println("Opening Notepad");
        }
    }

    public class ShutdownComputer extends Command {
        public void perform() {
            Command.this.perform();
            System.out.println("Shutting Computer");
        }
    }

}

其中用作: new Command.StartComputer().new OpenNotepad().new ShutdownComputer().perform();

第一個編譯好我的IntelliJ。

嚴格地說,靜態成員類不是內部類。 它們被稱為嵌套類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM