类和对象
面向对象概述
面向对象的基本概念
- 对象(Object)
- 定义:对象是现实世界中实体的抽象,具有状态(属性)和行为(方法)。
- 特点:
- 状态:描述对象的静态特征(如汽车的品牌、颜色)。
- 行为:描述对象的动态特征(如汽车的启动、加速)。
示例:
// 定义一个汽车对象
Car myCar = new Car();
myCar.brand = "Toyota"; // 状态
myCar.start(); // 行为
- 类(Class)
- 定义:类是对象的模板,描述一类对象的共同特征和行为。
- 关系:类是抽象,对象是类的实例。
示例:
// 定义汽车类
public class Car {
// 状态(成员变量)
String brand;
int speed;
// 行为(方法)
void start() {
System.out.println("Car is starting...");
}
}
- 消息传递
- 定义:对象之间通过方法调用进行交互,包含接收对象、方法名和参数。
示例:
class Calculator {
int add(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator cal = new Calculator();
int result = cal.add(3, 5); // 消息传递:调用add方法
System.out.println("结果:" + result); // 输出:8
}
}
面向对象的基本特征
- 封装(Encapsulation)
- 核心思想:隐藏内部细节,通过公共接口访问数据。
- 实现方式:
- 使用 private 保护成员变量。
- 通过 public 的 getter 和 setter 方法操作数据。
示例:
class BankAccount {
private double balance;
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("存款成功,余额:" + balance);
}
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
System.out.println("取款成功,余额:" + balance);
}
}
}
- 继承(Inheritance)
- 核心思想:子类继承父类的属性和方法,实现代码复用。
- 语法:使用 extends 关键字。
示例:
class Animal {
String name;
void eat() {
System.out.println(name + "在吃东西");
}
}
class Dog extends Animal {
void bark() {
System.out.println(name + "汪汪叫");
}
}
// 使用继承类
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.name = "多多";
myDog.eat(); // 调用父类方法
myDog.bark(); // 调用子类特有方法
}
}
- 多态(Polymorphism)
- 核心思想:同一方法在不同场景下有不同实现。
- 实现方式:
- 方法重载:同一类中同名方法参数不同。
- 方法覆盖:子类重写父类方法。
示例:
// 方法重载
class MathUtils {
int add(int a, int b) {
return a + b; }
double add(double a, double b) {
return a + b; }
}
// 方法覆盖
class Animal {
String name;
void eat() {
System.out.println(name + "在吃东西");
}
}
class Cat extends Animal {
@Override
void eat() {
System.out.println("猫吃鱼");
}
}
面向对象编程(OOP)的优势
易维护: 封装和继承使得代码结构更加清晰,各个模块之间的耦合度降低,当需要修改某个功能时,只需要修改相关的类和方法,而不会影响到其他部分的代码。
可重用: 通过继承和组合,可以复用已有的类和方法,减少代码的重复编写,提高开发效率。
可扩展: 多态性使得代码具有良好的扩展性,当需要添加新的功能或类型时,只需要创建新的子类并实现相应的方法即可,而不需要修改现有的代码。
类的定义与对象操作
类的定义
类声明:
[访问修饰符] [修饰符] class 类名 [extends 父类名] [implements 接口名列表] {
// 类体
}
类声明包含访问修饰符(如 public 或缺省)、类名、继承信息(使用 extends 关键字)和实现接口信息(使用 implements 关键字)。如果没有指定继承的类,默认继承自 Object 类。例如以下代码示例:
// 公共类,可被其他包中的类访问
public class MyClass {
// 类体
}
// 缺省访问修饰符,只能在同一个包中访问
class AnotherClass {
// 类体
}
// 继承自 MyClass 类
class SubClass extends MyClass {
// 类体
}
类体的定义:
类体包含构造方法、成员变量和成员方法。
成员变量:
成员变量也称为属性,用于存储类或对象的状态信息。
语法:[访问修饰符] [修饰符] 数据类型 变量名 [= 初始值];
说明:
- 访问修饰符:如 public、private、protected 或默认(无修饰符),用于控制成员变量的访问权限。
- 修饰符:例如 static(静态变量,属于类而不是对象)、final(常量,值不可变)等。
- 数据类型:可以是基本数据类型(如 int、double 等)或引用数据类型(如 String、自定义类等)。
- 初始值:可选,用于在声明变量时为其赋初始值。
构造方法:
构造方法用于创建类的对象,并对对象的成员变量进行初始化。
语法:
[访问修饰符] 类名(参数列表) {
// 构造方法体
}
说明:
- 访问修饰符:控制构造方法的访问权限。
- 类名:构造方法的名称必须与类名相同。
- 参数列表:可以包含零个或多个参数,用于接收创建对象时传递的值。
- this 关键字:用于引用当前对象,在构造方法中可用于区分成员变量和局部变量。
成员方法:
成员方法用于定义类的行为,实现特定的功能。
语法:
[访问修饰符] [修饰符] 返回值类型 方法名(参数列表) {
// 方法体
[return 返回值;]
}
说明:
- 访问修饰符:控制方法的访问权限。
- 修饰符:如 static(静态方法,属于类而不是对象)、final(最终方法,不能被重写)等。
- 返回值类型:指定方法返回值的数据类型,如果方法不返回任何值,则使用 void。
- 方法名:遵循 Java 命名规范,通常采用小驼峰命名法。
- 参数列表:可以包含零个或多个参数,用于接收调用方法时传递的值。
- return 语句:用于从方法中返回一个值,返回值的类型必须与方法声明的返回值类型一致。
以下是一个 Car 类的类声明以及类体定义的代码示例:
public class Car {
private String brand;
private int wheels;
public Car(String brand, int wheels) {
this.brand = brand;
this.wheels = wheels;
}
// 成员方法,无返回值,打印汽车信息
public void displayInfo() {
System.out.println("Brand: " + brand + ", Wheels: " + wheels);
}
// 成员方法,有返回值,返回轮子数量
public int getWheels() {
return wheels;
}
}
对象的创建与使用
对象创建:
对象创建有两种格式,以上面的 Car 类为例:
- 先声明对象的引用,然后使用 new 关键字实例化对象。
Car car;
car = new Car();
- 声明对象的引用的同时使用 new 关键字实例化对象。(推荐这种格式)
Car car = new Car();
访问成员:
使用点号运算符(.)访问类的成员变量和调用成员方法。以下是一个对象 rectangle 访问 Rectangle 类中成员变量以及调用成员方法的代码示例:
class Rectangle {
double length;
double width;
public double getArea() {
return length * width;
}
public static void main(String[] args) {
Rectangle rectangle = new Rectangle();
rectangle.length = 5;// 通过( .成员变量 )来定义成员变量
rectangle.width = 3;
double area = rectangle.getArea();// 通过( .成员方法 )来访问成员方法
System.out.println("矩形的长是:" + rectangle.