📜  C++和Java中的继承比较

📅  最后修改于: 2020-03-29 08:26:03             🧑  作者: Mango

继承的目的在C++和Java中是相同的。两种语言都使用继承来重用代码和/或创建is-a关系。两种语言提供继承支持的方式都有以下差异。
1)在Java中,所有类都直接或间接地从Object类继承。因此,Java中始终只有一个类的继承树,而Object类是该树的根。在Java中,如果我们创建一个不从任何类继承的类,那么它将自动从Object类继承。在C++中,有许多类。当我们创建一个不继承任何东西的类时,我们在森林中创建了一个新树。
以下Java示例显示Test类自动从Object类继承。

class Test {
    // Test的成员
}
class Main {
  public static void main(String[] args) {
    Test t = new Test();
    System.out.println("t是Object的实例: " + (t instanceof Object));
  }
}

输出:

t是Object的实例: true

2)在Java中,不能直接访问祖父母类的成员。有关更多详细信息,请参见此
3) Java中受保护成员访问说明符的含义有所不同。在Java中,即使B不是从A继承(它们都必须在同一个包中),也可以在同一包的其他“ B”类中访问“ A”类的受保护成员。例如,在以下程序中,可以在B中访问A的受保护成员。

// 文件名 B.java
class A {
    protected int x = 10, y = 20;
}
class B {
    public static void main(String args[]) {
        A a = new A();
        System.out.println(a.x + " " + a.y);
    }
}

4) Java使用extends关键字进行继承。与C++不同,Java不提供像public,protected或private这样的继承说明符。因此,我们无法更改Java中基类成员的保护级别,如果某些数据成员在基类中是公共的或受保护的,则它在派生类中仍是公共的或受保护的。与C++一样,无法在派生类中访问基类的私有成员。
与C++不同,在Java中,我们不必记住那些继承规则,它们是基类访问说明符和继承说明符的组合。

5)在Java中,默认情况下方法是虚拟的。在C++中,我们显式使用virtual关键字。
6) Java使用关键字interface用于接口,将abstract关键字用于抽象类和抽象函数。
以下是一个Java抽象类示例。

// abstract类例子
abstract class myAbstractClass {
   // abstract方法
   abstract void myAbstractFun();
   // 常规方法
   void fun() {
      System.out.println("在fun内");
   }
}
public class myClass extends myAbstractClass {
   public void myAbstractFun() {
      System.out.println("在My fun内");
   }
}

以下是一个Java接口示例:

// 接口interface例子
public interface myInterface {
   // myAbstractFun() 是public abstract, 尽管我们没有使用这些关键字
   void myAbstractFun();  // 同样也是 public abstract void myAbstractFun()
}
// 请注意implements关键字
public class myClass implements myInterface {
   public void myAbstractFun() {
      System.out.println("在My fun在");
   }
}

7)与C++不同,Java不支持多重继承。一个类不能从多个类中继承。但是,一个类可以实现多个接口。
8)在C++中,会自动调用父类的默认构造函数,但如果要调用父类的参数化构造函数,则必须使用Initializer list。像C++一样,父类的默认构造函数在Java中会自动调用,但是如果要调用参数化的构造函数,则必须使用super来调用父构造函数。请参见以下Java示例。

package main;
class Base {
    private int b;
    Base(int x) {
        b = x;
        System.out.println("父类构造函数");
    }
}
class Derived extends Base {
    private int d;
    Derived(int x, int y) {
        // 调用父类参数化构造函数
        super(x);
        d = y;
        System.out.println("子类构造函数");
    }
}
class Main{
    public static void main(String[] args) {
      Derived obj = new Derived(1, 2);
    }
}

输出:

父类构造函数
子类构造函数