📅  最后修改于: 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);
}
}
输出:
父类构造函数
子类构造函数