深入对比Java和Python的面向对象编程(OOP)特性
Java是面向对象编程(OOP)语言,Python也是面向对象编程(OOP)语言,其内容包含类、对象、继承、封装、多态。下面我们要对两者的OOP特性进行逐一对比。

1. 类和对象
Java支持面向对象的编程方式,Python也支持面向对象的编程方式,其核心概念包括:
Java:必须先定义类,再创建对象
class Dog {
String name; // 成员变量
int age;
// 构造函数
Dog(String name, int age) {
this.name = name;
this.age = age;
}
// 方法
void bark() {
将变量name的值与字符串" is barking!"进行拼接,然后输出拼接后的结果
}
}
public class Main {
公共静态无效主函数,使用字符串数组作为参数
创建一个新的对象,该对象是名为Dog的类的实例,实例名为dog1,使用构造函数创建,传入参数"Buddy"和3 。
dog1.bark(); // 调用方法
}
}
特点:
Python:类则更灵活
class Dog:
定义一个初始化方法,该方法接收两个参数,分别是name和age 。
self.name = name # 实例变量
self.age = age
def bark(self):
打印,格式化输出,将self.name和is barking!组合成字符串,输出该字符串 。
# 创建对象
dog1 = Dog("Buddy", 3)
dog1.bark()
特点:
继承Java,要显式声明extends关键字
class Animal {
void eat() {
系统输出打印,“这种动物进食。”
}
}
// Dog 继承 Animal
class Dog extends Animal {
void bark() {
系统输出“狗在叫!”
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 继承自 Animal
dog.bark(); // Dog 自己的方法
}
}
特点:
Python:支持多继承
class Animal:
def eat(self):
打印,“这种动物吃食物。”
class Dog继承Animal ,其中Dog类继承自Animal类 。
def bark(self):
print("Dog is barking!")
dog = Dog()
dog.eat() # 继承的方法
dog.bark() # Dog 自己的方法
特点:
3. 封装(Encapsulation)
封装是指限制类的属性或方法的访问权限,确保数据的安全性。
Java,有private访问修饰符,有protected访问修饰符,还有public访问修饰符。
class Person {
private String name; // 私有变量
private int age;
// 通过构造函数初始化
定义一个名为Person的构造函数,它有两个参数,一个是字符串类型的name,另一个是整型的age 。
this.name = name;
this.age = age;
}
// 提供公有方法访问私有变量
public String getName() {
return name;
}
}
public class Main {
public static void main(String[] args) {
创建一个名为p的对象,该对象属于Person类型,使用参数“Alice”和25进行初始化 。
这是错误的,因为name是私有的,所以不能通过System.out.println(p.name)来访问 。
System.out.println(p.getName()); 这是正确的,是通过方法进行访问的 。
}
}
特点:
Python:_ 和 __ 伪私有变量
class Person:
def __init__(self, name, age):
self._name被赋值为name,这是一个受保护变量,按照约定俗成的规则,外部仍然能够对其进行访问。
这是一个私有变量,不能直接访问,它被赋值为age,变量名为__age 。
def get_name(self):
return self._name
p = Person("Alice", 25)
打印,p的获取名称的方法的返回值,结果为 "Alice" 。
打印p的年龄,这是错误的,不能直接进行访问。
打印,p的_Person__age属性,这可以进行访问,(Python名字改写)。
特点:
4. 多态(Polymorphism)
多态:不同类的对象可以使用相同的方法(方法重写)。
Java:方法重写
class Animal {
void makeSound() {
系统输出“动物发出声音。”
}
}
class Dog extends Animal {
@Override
void makeSound() {
系统输出“狗叫。”
}
}
public class Main {
public static void main(String[] args) {
创建一个Animal类型的对象myAnimal,将其初始化为一个Dog类型的实例,这是向上转型。
调用Dog的方法,其结果为 "Dog barks." ,具体操作为执行myAnimal.makeSound();
}
}
特点:
Python:动态类型 + 方法重写
class Animal:
def make_sound(self):
打印,“动物发出声音。”
class Dog(Animal):
def make_sound(self):
print("Dog barks.")
animal = Dog() # 直接创建 Dog 对象
动物,发出声音 # “狗叫。”
特点:
5. 对比总结
特性
Java
Python
类
class 关键字,变量需声明类型
class 关键字,动态类型
对象
new 关键字创建对象
直接调用类名创建对象
继承
extends 关键字,单继承
直接继承,多继承支持
封装
private/protected/public 修饰符
_变量(约定)__变量(伪私有)
多态
方法重写 (@Override),强类型检查
方法重写,动态类型
Python的确比Java简单不少。各位Java的小伙伴,你弄明白了吗?