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++类型