前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++和Java中继承的比较

C++和Java中继承的比较

作者头像
鲸落c
发布2022-11-14 16:40:43
5620
发布2022-11-14 16:40:43
举报
文章被收录于专栏:鲸落学习笔记鲸落学习笔记

theme: channing-cyan highlight: a11y-dark


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

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

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

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

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

输出:

代码语言:javascript
复制
t 是对象的实例:true

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

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

代码语言:javascript
复制
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 抽象类示例。

代码语言:javascript
复制
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 接口示例

代码语言:javascript
复制
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 示例。

代码语言:javascript
复制
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);
    }
}

输出: 

代码语言:javascript
复制
调用的基本构造函数
派生构造函数调用
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档