C++和Java中继承的比较

651 阅读3分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

继承的目的在 C++ 和 Java 中是一样的。两种语言都使用继承来重用代码和/或创建“is-a”关系。以下示例将演示 Java 和 C++ 之间提供继承支持的差异。 

1) 在Java中,所有的类都直接或间接地继承自Object类。因此,Java 中总是存在一个类的单一继承树,而Object 类是树的根。在 Java 中,当创建一个类时,它会自动从Object 类继承。然而,在 C++ 中,有一个类森林;当我们创建一个不从另一个继承的类时,我们在森林中创建了一棵新树。

以下 Java 示例显示 Test 类自动继承自 Object 类。 

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

输出:

t 是对象的实例:true

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

 例如,在下面的程序中,A 的受保护成员可以在 B 中访问。

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++ 中,我们明确使用虚拟关键字。有关更多详细信息,请参阅此 G-Fact。
6)  Java对接口使用单独的关键字interface,对抽象类和抽象函数使用abstract关键字。

下面是一个 Java 抽象类示例。

abstract class myAbstractClass {
	
abstract void myAbstractFun();

void fun() {
	System.out.println("Inside My fun");
}
}

public class myClass extends myAbstractClass {
public void myAbstractFun() {
	System.out.println("Inside My fun");
}
}

下面是一个 Java 接口示例

public interface myInterface {
void myAbstractFun(); 
}

public class myClass implements myInterface {
public void myAbstractFun() {
	System.out.println("Inside 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);
	}
}

输出: 

调用的基本构造函数
派生构造函数调用