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);
  }
}
复制代码


输出:


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



目录
相关文章
|
15天前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
47 16
|
11天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
37 5
|
1月前
|
Java Android开发 C++
Java和C++
Java和C++
47 15
|
2月前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
40 1
【C++】继承
|
2月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
155 1
WK
|
2月前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
66 1
|
3月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
32 5
|
3月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
51 3
|
3月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
75 2
|
3月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
55 2