【整理向】c++,Java与Python的面向对象(OOP)之间的异同

news/2024/11/8 21:02:35/

C++、Java 和 Python 都是支持面向对象编程(OOP)的语言,但它们在实现 OOP 的方式上存在一些相似性和差异。我们可以从类和对象、继承、封装、多态等方面对比它们的异同。

1. 类和对象

  • 相同点:C++、Java 和 Python 都使用类作为对象的蓝图。对象是类的实例,拥有类定义的属性和方法。
  • 不同点
    • C++:类和结构体的定义较为相似(结构体也可以有方法)。C++中可以使用 publicprotectedprivate 修饰类的成员,构造函数名与类名相同。
    • Java:所有类必须位于一个文件中,文件名必须与公共类(public class)的名称相同。Java 通过 publicprotectedprivate 控制访问权限,并且支持包(package)级别访问。
    • Python:Python 使用 class 关键字定义类,所有对象的属性在实例化时才真正生成。Python 没有真正的“私有”属性,使用单下划线 _ 或双下划线 __ 只是约定的保护属性的方法。
示例:
// C++: 定义类和对象
class Dog {
public:std::string name;int age;Dog(std::string n, int a) : name(n), age(a) {}  // 构造函数
};Dog myDog("Buddy", 3);  // 创建对象
// Java: 定义类和对象
public class Dog {public String name;public int age;public Dog(String name, int age) {this.name = name;this.age = age;}
}Dog myDog = new Dog("Buddy", 3);  // 创建对象
# Python: 定义类和对象
class Dog:def __init__(self, name, age):self.name = nameself.age = agemy_dog = Dog("Buddy", 3)  # 创建对象

2. 构造函数和析构函数

  • 相同点:三者都支持构造函数(constructor),用于初始化对象。
  • 不同点
    • C++:允许自定义析构函数(destructor),当对象生命周期结束时自动调用析构函数来释放资源。
    • Java:没有显式的析构函数,依赖垃圾回收机制(Garbage Collection)回收内存。可以重写 finalize() 方法,但不推荐。
    • Python:也有垃圾回收机制,不依赖析构函数,通常用 __del__ 作为析构函数,但它的调用并不保证一定发生。
示例:
// C++: 构造函数和析构函数
class Dog {
public:Dog() { std::cout << "Dog created\n"; }~Dog() { std::cout << "Dog destroyed\n"; }  // 析构函数
};
// Java: 构造函数
public class Dog {public Dog() {System.out.println("Dog created");}@Overrideprotected void finalize() {System.out.println("Dog destroyed");}
}
# Python: 构造函数和析构函数
class Dog:def __init__(self):print("Dog created")def __del__(self):print("Dog destroyed")

3. 封装

  • 相同点:都支持通过访问控制符实现封装,确保类的内部细节对外部不可见。
  • 不同点
    • C++:使用 publicprotectedprivate 控制属性和方法的访问权限。
    • Java:也使用 publicprotectedprivate 关键字。此外,还有“包访问”权限,即不使用任何修饰符的情况下允许同一包内访问。
    • Python:没有真正的私有属性,仅靠命名约定,如单下划线_表示“受保护”,双下划线__表示“私有”。但这些属性在技术上仍然可以被访问。
示例:
// C++: 封装
class Dog {
private:int age;
public:void setAge(int a) { age = a; }int getAge() { return age; }
};
// Java: 封装
public class Dog {private int age;public void setAge(int age) { this.age = age; }public int getAge() { return age; }
}
# Python: 封装
class Dog:def __init__(self):self.__age = Nonedef set_age(self, age):self.__age = agedef get_age(self):return self.__age

4. 继承

  • 相同点:三者都支持继承,允许子类继承父类的属性和方法。
  • 不同点
    • C++:支持多重继承,即一个类可以有多个父类。可以指定继承的访问级别(publicprotectedprivate)。
    • Java:不支持多重继承,但可以通过接口(interface)实现多重继承的效果。
    • Python:支持多重继承,使用括号列出多个父类;继承顺序由MRO(方法解析顺序)决定。
示例:
// C++: 继承
class Animal {};
class Dog : public Animal {};  // 公开继承
// Java: 继承
public class Animal {}
public class Dog extends Animal {}
# Python: 继承
class Animal:passclass Dog(Animal):pass

5. 多态

  • 相同点:多态允许在父类引用下调用子类方法,提升了代码的灵活性。
  • 不同点
    • C++:通过虚函数(virtual)和纯虚函数(= 0)实现运行时多态。静态多态可以通过函数重载或模板实现。
    • Java:默认所有非静态方法都是虚函数,允许重写父类方法实现多态。
    • Python:通过方法重写实现多态,不需要额外关键字,且支持鸭子类型(duck typing)。
示例:
// C++: 多态
class Animal {
public:virtual void speak() { std::cout << "Animal sound\n"; }
};class Dog : public Animal {
public:void speak() override { std::cout << "Woof\n"; }
};Animal* animal = new Dog();
animal->speak();  // 输出:Woof
// Java: 多态
public class Animal {public void speak() {System.out.println("Animal sound");}
}public class Dog extends Animal {@Overridepublic void speak() {System.out.println("Woof");}
}Animal animal = new Dog();
animal.speak();  // 输出:Woof
# Python: 多态
class Animal:def speak(self):print("Animal sound")class Dog(Animal):def speak(self):print("Woof")animal = Dog()
animal.speak()  # 输出:Woof

6. 接口与抽象类

  • 相同点:三者都允许定义抽象行为,供子类实现。
  • 不同点
    • C++:通过纯虚函数来定义抽象类,但没有接口概念。
    • Java:有抽象类和接口的区别,接口只定义行为,无实现。
    • Python:通过模块 abc 定义抽象基类,且不区分抽象类和接口。

总结

  • 相似之处:三者都支持类和对象、封装、继承和多态等OOP基本特性。
  • 不同之处
    • 内存管理:C++需要手动管理内存,Java和Python都有垃圾回收机制。
    • 继承机制:C++和Python支持多重继承,Java通过接口来实现类似功能。
    • 访问控制:C++和Java有显式的访问控制符,Python依赖命名约定。

http://www.ppmy.cn/news/1545460.html

相关文章

前端UniApp面试题及参考答案(100道题)

目录 UniApp 支持哪些平台? UniApp 在不同平台上的表现有何差异? 如何处理 UniApp 中的平台差异? UniApp 项目创建与目录结构 项目创建 目录结构 如何创建一个 UniApp 项目? UniApp 项目的基本目录结构是什么样的? 解释一下 UniApp 中的页面生命周期钩子函数有哪…

汇编语言:查找以‘$’结尾的字符串str中数字字符的个数并输出

两个子函数&#xff0c;一个子函数统计字符串中字符的个数并放在CX中 另一个输出AX中的无符号整数 &#xff0c;可以是0&#xff0c;但最大只能是4位数&#xff0c;并且前三位不能超过255 在主函数中先调用统计字符个数的子函数COUNT&#xff0c;然后把CX中的数复制到AX中&am…

mybatis+postgresql,无感读写json字段

1.实体类中字段类型 import com.alibaba.fastjson.JSONObject;Data public class TestDto {private String name;//对应数据库的JSON字段private JSONObject page_detail;} 2.自定义实现typeHandler package base.utils;import com.alibaba.fastjson.JSONObject; import org…

生成式语言模型的文本生成评价指标(从传统的基于统计到现在的基于语义)

文本生成评价指标 以 BLEU 为代表的基于统计的文本评价指标基于 BERT 等预训练模型的文本评价指标 1.以 BLEU 为代表的基于统计的文本评价指标 1.BLEU(Bilingual Evaluation Understudy, 双语评估辅助工具) 所有评价指标的鼻祖&#xff0c;核心思想是比较 候选译文 和 参考…

使用QtWebEngine的Mac应用如何发布App Store

前言 因为QtWebEngine时第三方包,苹果并不直接支持进行App Store上签名和发布,所以构建和发布一个基于使用QtWebEngine的应用程序并不容易,这里我们对Qt 5.8稍微做一些修改,以便让我们的基于QtWeb引擎的应用程序并让签名能够得到苹果的许可。 QtWebEngine提供了C++和Qml的…

C++20 STL CookBook2 更强大的编译时 + 安全比较 + spaceship比较符

目录 使用编译时vector和字符串相关的上下文变量 安全的比较整数 <> :) 使用编译时vector和字符串相关的上下文变量 在大部分C语言程序中&#xff0c;我见过不少人是这样使用常量字符串的&#xff1a; #define STR "Hello, C" 然后可能传递进入一些函数做…

基于开源 AI 智能名片、S2B2C 商城小程序的用户获取成本优化分析

摘要&#xff1a;本文围绕用户获取成本&#xff08;CAC&#xff09;这一关键指标展开深入剖析&#xff0c;详细阐述其计算方式&#xff0c;并紧密结合开源 AI 智能名片与 S2B2C 商城小程序的独特性质&#xff0c;从多个维度探讨如何通过挖掘新的获客渠道、巧妙运用私域流量池等…

uniapp 下拉选择器picker

<picker mode"selector" :range"options" change"onPickerChange"> <div style"border: 1px solid #ccc;">选择品牌</div> </picker> let options reactive([选项1, 选项2, 选项3, 选项4]); const…