类和对象
类(Class)和对象(Object)是面向对象编程(Object-Oriented Programming,OOP)中的核心概念。它们构成了面向对象编程的基本单元,用于封装(属性)和操作数据的行为(方法)。
类(Class)
类 是一种用户定义的数据类型,它描述了一组具有相似属性(也称成员变量或字段)和行为(也称成员函数或方法)的对象模板。类定义了对象的结构(数据如何组织)和行为(可以执行的操作)。类通常包含以下几个关键部分:
- 属性(Attributes) 或 字段(Fields):类中定义的变量,用于存储对象的状态或数据。这些变量可以是基本类型(如整数、字符串等)或复杂类型(如其他类的对象)。
- 方法(Methods):类中定义的函数,用于描述对象能够执行的操作或响应的消息。方法可以访问和修改对象的属性,也可以对外提供服务。方法通常包括构造函数(用于初始化新创建的对象)和普通成员方法。
- 构造器(Constructor):特殊的方法,用于初始化新创建的对象。构造器与类同名,没有返回类型,并在创建对象时自动调用。
- 访问修饰符(Access Modifiers):如public、private、protected等,用于控制类的成员对其他类或对象的可见性和可访问性。
- 继承(Inheritance):一个类可以继承另一个类的属性和方法,从而形成类的层次结构。继承允许子类扩展或定制基类的行为,实现代码复用。
- 多态(Polymorphism):同一接口,多种实现。通过方法重写(Override)和接口实现,使得不同类的对象可以响应相同的消息(方法调用),但表现出不同的行为。
对象(Object)
象 对是类实例,是类定义的具体化。创建一个对象的过程称为实例化。每个对象具有类所定义的属性(状态)和方法(行为),并拥有自己独立的内存空间来存储这些状态信息。对象之间可以通过方法相互交互,也可以通过方法对外部代码提供服务。的对象的特征包括:
- 封装(Encapsulation):对象将数据(属性)与处理数据的代码(方法)封装在一起,形成一个自包含的实体。封装隐藏了对象内部的实现细节,仅通过公开的接口(方法)与外界交互。这种封装机制有助于保护数据的安全性,防止意外修改,并提高代码的模块化程度和可维护性。
- 标识(Identity):每个对象在系统中都有唯一的标识,即使它们属于同一类且具有相同的属性值。这个标识通常由系统自动分配,如内存地址。标识确保了对象之间的区别和独立性,使得系统能够准确地追踪和操作各个对象。
- 状态(State):对象的状态由其属性(字段或成员变量)的当前值来体现。属性描述了对象的特征或属性,如姓名、年龄、位置等。不同的对象即使属于同一类,也可能因为属性值的不同而处于不同的状态。
- 行为(Behavior):对象通过方法(成员函数)来展示其行为或功能。方法定义了对象能做什么,如计算、查询、更新状态、与其他对象通信等。方法操作对象的内部状态,对外提供服务,实现对象间的协作。
- 多态(Polymorphism):多态指同一个消息(通常是方法调用)可以被不同类型的对象以各自适合的方式响应。实现多态的方式有方法重写(Override)、方法重载(Overload)等。多态增强了代码的灵活性和可扩展性,使程序能够以统一的方式处理多种不同类型的对象。
- 继承(Inheritance):对象可以继承自另一个对象(通常指类的继承)。继承意味着子对象不仅拥有父对象的所有属性和方法,还可以添加新的属性、方法或重写现有方法。继承促进了代码复用,形成了类的层次结构,使得对象可以按照“is-a”或“has-a”关系组织起来。
- 关联(Association):对象之间可以通过关联关系建立联系。关联可以是单向或双向的,可以是临时的或持久的,也可以是一对一、一对多、多对一或多对多的。关联描述了对象之间的依赖、协作或包含关系,如一个订单对象可能关联到多个商品对象。
// 定义一个表示"汽车"的类 Car
public class Car {
// 属性(状态)
private String make; // 汽车品牌
private String model; // 汽车型号
private int year; // 生产年份
private double speed; // 当前速度
// 构造函数(初始化对象状态)
public Car(String make, String model, int year) {
this.make = make;
this.model = model;
this.year = year;
this.speed = 0; // 初始速度为0
}
// 方法(行为)
public void accelerate(double deltaSpeed) {
speed += deltaSpeed;
System.out.println("Car " + make + " " + model + " accelerated. Current speed: " + speed);
}
public void brake(double deltaSpeed) {
speed -= deltaSpeed;
System.out.println("Car " + make + " " + model + " braked. Current speed: " + speed);
}
// 封装:提供公共的getter和setter方法访问私有属性
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
// ... 同样为model和year属性提供getter和setter方法
// 多态:继承自Vehicle接口的drive方法
public interface Vehicle {
void drive();
}
// Car类实现Vehicle接口的drive方法
public class SportsCar extends Car implements Vehicle {
@Override
public void drive() {
System.out.println("Sports car is driving with style!");
}
}
}
// 创建Car对象(实例化)
public class Main {
public static void main(String[] args) {
// 创建一个Car对象实例
Car myCar = new Car("Toyota", "Camry", 2029);
// 调用对象的方法
myCar.accelerate(50); // 加速
myCar.brake(20); // 刹车
// 通过getter方法获取属性值
String carMake = myCar.getMake();
System.out.println("Car make: " + carMake);
// 使用多态创建并驱动SportsCar对象
Vehicle sportsCar = new SportsCar("Ferrari", "Portofino", 2028);
sportsCar.drive(); // 输出:Sports car is driving with style!
}
}