C ++比較

在其他構造中定義的類#

在另一個類中定義

C++

巢狀類 [ref] (需要引用封閉類)

class Outer {
   class Inner {
      public:
         Inner(Outer* o) :outer(o) {}

      private:
         Outer*  outer;
   };
};

Java

[非靜態]巢狀類(又名內部類或成員類)

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

在另一類中靜態定義

C++

靜態巢狀類

class Outer {
   class Inner {
      ...
   };
};

Java

靜態巢狀類(又名靜態成員類) [參考]

class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
}

在方法中定義

(例如事件處理)

C++

本地類 [參考]

void fun() {
   class Test {
      /* members of Test class */
   };
}

另請參見 Lambda 表示式

Java

本地類 [參考]

class Test {
    void f() {
        new Thread(new Runnable() {
            public void run() {
                doSomethingBackgroundish();
            }
        }).start();
    }
}

覆蓋與過載

以下 Overriding vs Overloading 點適用於 C++和 Java:

  • 重寫方法與其基本方法具有相同的名稱和引數。
  • 過載方法具有相同的名稱但不同的引數,並且不依賴於繼承。
  • 具有相同名稱和引數但返回型別不同的兩種方法是非法的。請參閱有關“使用 Java 中的不同返回型別過載”的相關 Stackoverflow 問題 - 問題 1 ; 問題 2

多型性

多型性是通過繼承相關的不同類的物件對同一方法呼叫作出不同響應的能力。這是一個例子:

  • 基類使用區域作為抽象方法的形狀
  • 兩個派生類,Square 和 Circle,實現區域方法
  • 形狀參考指向 Square 和 area 被呼叫

在 C++中,多型性由虛方法啟用。在 Java 中,預設情況下方法是虛擬的。

施工/銷燬順序

施工/銷燬順序

物件清理

在 C++中,將解構函式宣告為虛擬是一個好主意,以確保在刪除基類指標時將呼叫子類的解構函式。

在 Java 中,finalize 方法類似於 C++中的解構函式; 但是,終結器是不可預測的(它們依賴於 GC)。最佳實踐 - 使用 close 方法進行顯式清理。

protected void close() {
    try {
       // do subclass cleanup
    }
    finally {
       isClosed = true;
       super.close();
    }
}

protected void finalize() {
    try {
       if(!isClosed) close();
    }
    finally {
       super.finalize();
    }
}

抽象方法和類

輔助功能修改器

修改 C++ Java
公眾 - 所有人都可以訪問 沒有特別說明 沒有特別說明
受保護 - 可由子類訪問 也可以由朋友訪問 也可在同一包裝內使用
私人 - 會員可以訪問 也可以由朋友訪問 沒有特別說明
預設 class default 是 private; struct default 是 public 可以在同一個包中的所有類訪問
其他 朋友 - 一種在沒有繼承的情況下授予私有和受保護成員訪問許可權的方法(見下文)

C++好友示例

class Node {
  private:
    int key;  Node *next;
    // LinkedList::search() can access "key" & "next"
    friend int LinkedList::search();
};

可怕的鑽石問題

當兩個類 B 和 C 繼承自 A,而 D 類繼承自 B 和 C 時,鑽石問題就會產生歧義。如果 A 中有一個方法,B 和 C 已經重寫,而 D 沒有覆蓋它,那麼 D 繼承的方法的哪個版本:B 的那個版本,還是 C 的版本? (來自維基百科

可怕的鑽石問題

雖然 C++一直容易受到鑽石問題的影響,但 Java 在 Java 8 之前很容易受到影響。最初,Java 不支援多重繼承,但隨著預設介面方法的出現,Java 類無法從多個類繼承實現。。

java.lang.Object 類

在 Java 中,所有類都是從 Object 類隱式或顯式繼承的。任何 Java 引用都可以轉換為 Object 型別。

C++沒有類似的物件類。

Java Collections 和 C++容器

Java Collections 與 C++ Containers 一致。

Java 集合流程圖

C++容器流程圖

整數型別

* Win64 API 只有 32 位

有更多的 C++型別