C++和Java中继承的比较

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

「这是我参与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);
  }
}
复制代码


输出:


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



目录
相关文章
|
2天前
|
安全 前端开发 Java
【C++】从零开始认识继承二)
在我们日常的编程中,继承的应用场景有很多。它可以帮助我们节省大量的时间和精力,避免重复造轮子的尴尬。同时,它也让我们的代码更加模块化,易于维护和扩展。可以说,继承技术是C++的灵魂。
13 1
|
2天前
|
安全 程序员 编译器
【C++】从零开始认识继承(一)
在我们日常的编程中,继承的应用场景有很多。它可以帮助我们节省大量的时间和精力,避免重复造轮子的尴尬。同时,它也让我们的代码更加模块化,易于维护和扩展。可以说,继承技术是C++的灵魂。
23 3
【C++】从零开始认识继承(一)
|
2天前
|
Java C++
部落(pta)(并查集) Java以及C++
部落(pta)(并查集) Java以及C++
11 2
|
2天前
|
Java C++
愤怒的牛(java c++)(二分典型例子)
愤怒的牛(java c++)(二分典型例子)
8 1
|
2天前
|
Java
【Java开发指南 | 第二十四篇】Java继承
【Java开发指南 | 第二十四篇】Java继承
9 0
|
2天前
|
Java
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
14 4
|
2天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
2天前
|
存储 编译器 C++
C++中的继承
C++中的继承
11 0
|
2天前
|
Java 编译器 开发者
Java一分钟之-继承:复用与扩展类的特性
【5月更文挑战第9天】本文探讨了Java中的继承机制,通过实例展示了如何使用`extends`创建子类继承父类的属性和方法。文章列举了常见问题和易错点,如构造器调用、方法覆盖、访问权限和类型转换,并提供了解决方案。建议深入理解继承原理,谨慎设计类结构,利用抽象类和接口以提高代码复用和扩展性。正确应用继承能构建更清晰、灵活的代码结构,提升面向对象设计能力。
16 0
|
2天前
|
Java
java面向对象——包+继承+多态(一)-2
java面向对象——包+继承+多态(一)
18 3