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

📅  最后修改于: 2022-05-13 01:55:39.555000             🧑  作者: Mango

C++和Java中的继承比较

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

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

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

Java
class Test {
    // members of test
}
class Main {
    public static void main(String[] args)
    {
        Test t = new Test();
        System.out.println("t is instanceof Object: "
                           + (t instanceof Object));
    }
}


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);
    }
}


Java
// An abstract class example
abstract class myAbstractClass {
 
    // An abstract method
    abstract void myAbstractFun();
 
    // A normal method
    void fun() { System.out.println("Inside My fun"); }
}
 
public class myClass extends myAbstractClass {
    public void myAbstractFun()
    {
        System.out.println("Inside My fun");
    }
}


Java
// An interface example
public interface myInterface {
   
    // myAbstractFun() is public
     // and abstract, even if we
    // don't use these keywords
    void myAbstractFun();
    // is same as public abstract void myAbstractFun()
}
 
// Note the implements keyword also.
public class myClass implements myInterface {
    public void myAbstractFun()
    {
        System.out.println("Inside My fun");
    }
}


Java
package main;
 
class Base {
    private int b;
    Base(int x)
    {
        b = x;
        System.out.println("Base constructor called");
    }
}
 
class Derived extends Base {
    private int d;
    Derived(int x, int y)
    {
        // Calling parent class parameterized constructor
        // Call to parent constructor must be the first line
        // in a Derived class
        super(x);
        d = y;
        System.out.println("Derived constructor called");
    }
}
 
class Main {
    public static void main(String[] args)
    {
        Derived obj = new Derived(1, 2);
    }
}


输出
t is instanceof Object: true

2)在Java中,祖父类的成员不能直接访问。 (有关详细信息,请参阅本文)。

3)受保护的成员访问说明符的含义在Java中有些不同。在Java中,类“A”的受保护成员可以在同一个包的其他类“B”中访问,即使 B 不是从 A 继承的(它们都必须在同一个包中)。

例如,在下面的程序中,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);
    }
}
输出
10 20

4) Java使用“扩展” 继承的关键字。与 C++ 不同, Java不提供像 public、protected 或 private 这样的继承说明符。因此,我们不能更改Java中基类成员的保护级别,如果某些数据成员在基类中是公共的或受保护的,那么它在派生类中仍然是公共的或受保护的。与 C++ 一样,基类的私有成员不能在派生类中访问。

与 C++ 不同,在Java中,我们不必记住那些由基类访问说明符和继承说明符组合而成的继承规则。

5) 在Java中,方法默认是虚拟的。在 C++ 中,我们明确使用虚拟关键字(有关详细信息,请参阅本文)。

6) Java对接口使用单独的关键字interface 对抽象类和抽象函数使用抽象关键字。

以下是一个Java抽象类示例,

Java

// An abstract class example
abstract class myAbstractClass {
 
    // An abstract method
    abstract void myAbstractFun();
 
    // A normal method
    void fun() { System.out.println("Inside My fun"); }
}
 
public class myClass extends myAbstractClass {
    public void myAbstractFun()
    {
        System.out.println("Inside My fun");
    }
}

以下是一个Java接口示例,

Java

// An interface example
public interface myInterface {
   
    // myAbstractFun() is public
     // and abstract, even if we
    // don't use these keywords
    void myAbstractFun();
    // is same as public abstract void myAbstractFun()
}
 
// Note the implements keyword also.
public class myClass implements myInterface {
    public void myAbstractFun()
    {
        System.out.println("Inside My fun");
    }
}

7)与 C++ 不同, Java不支持多重继承。一个类不能从多个类继承。但是,一个类可以实现多个接口。

8)在C++中,会自动调用父类的默认构造函数,但是如果我们要调用父类的参数化构造函数,就必须使用Initializer列表。和 C++ 一样, Java中会自动调用父类的默认构造函数,但如果要调用参数化构造函数,则必须使用 super 调用父构造函数。请参阅以下Java示例。

Java

package main;
 
class Base {
    private int b;
    Base(int x)
    {
        b = x;
        System.out.println("Base constructor called");
    }
}
 
class Derived extends Base {
    private int d;
    Derived(int x, int y)
    {
        // Calling parent class parameterized constructor
        // Call to parent constructor must be the first line
        // in a Derived class
        super(x);
        d = y;
        System.out.println("Derived constructor called");
    }
}
 
class Main {
    public static void main(String[] args)
    {
        Derived obj = new Derived(1, 2);
    }
}

输出

Base constructor called
Derived constructor called