第四章:面向对象编程
- 4.1 类与对象
- 4.1.1 类的概念
- 4.1.2 对象的实例化与使用
- 4.1.3 访问修饰符与封装
- 4.2 继承、封装与多态
- 4.2.1 继承
- 4.2.2 封装
- 4.2.3 多态
- 4.3 抽象类与接口
- 4.3.1 抽象类
- 4.3.2 接口
- 4.4 包与访问控制
4.1 类与对象
4.1.1 类的概念
在Java中,类(Class) 是面向对象编程的核心概念之一,它是对现实世界中实体的抽象,用来描述一类对象的共同特征和行为。每个类都有其属性(也称为成员变量或字段)和方法(也称为成员函数)。例如,我们可以创建一个Person
类来描述人的基本属性和行为:
public class Person {private String name; // 属性:姓名private int age; // 属性:年龄// 构造方法public Person(String name, int age) {this.name = name;this.age = age;}// 方法:获取姓名public String getName() {return this.name;}// 方法:设置年龄public void setAge(int age) {this.age = age;}// 方法:显示信息public void displayInfo() {System.out.println("姓名:" + this.name + ",年龄:" + this.age);}
}
4.1.2 对象的实例化与使用
类是模板,而对象(Object) 是类的实例。通过类可以创建多个具有相同属性和方法的对象。例如,基于上面的Person
类创建两个不同的个体:
public class Main {public static void main(String[] args) {// 实例化对象Person person1 = new Person("Alice", 25);Person person2 = new Person("Bob", 30);// 调用对象的方法person1.displayInfo(); // 输出:姓名:Alice,年龄:25person2.setAge(35); // 修改Bob的年龄person2.displayInfo(); // 输出:姓名:Bob,年龄:35}
}
4.1.3 访问修饰符与封装
在上述例子中,我们注意到name
和age
属性被声明为private
,这是Java中的访问修饰符,用于限制类外部对这些成员的访问权限。通过提供公共的getter和setter方法实现了数据的封装,这是面向对象编程的一个重要原则。
4.2 继承、封装与多态
4.2.1 继承
继承(Inheritance) 是子类从父类那里继承已有的属性和方法的机制,增强了代码的复用性和可扩展性。以下是一个简单的继承示例:
public class Student extends Person {private String studentId;public Student(String name, int age, String studentId) {super(name, age); // 调用父类构造方法初始化基本信息this.studentId = studentId;}// 学生特有方法public void study() {System.out.println(this.getName() + "正在学习...");}
}public class Main {public static void main(String[] args) {Student student = new Student("Charlie", 20, "S001");student.study(); // 输出:Charlie正在学习...}
}
4.2.2 封装
封装(Encapsulation)是指将对象的状态信息(即属性)隐藏在对象内部,通过公共方法对外提供操作和访问的能力。如前文所述,通过getter和setter方法实现封装。
4.2.3 多态
多态(Polymorphism) 是指允许不同类的对象对同一消息作出不同的响应,包括方法重载(Overloading)和方法覆盖(Overriding)。方法重载是在同一个类中定义多个同名方法,但参数列表不同;方法覆盖则是子类重新定义了父类的方法。
public class Animal {public void makeSound() {System.out.println("动物发出声音...");}
}public class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("汪汪汪...");}
}public class Main {public static void main(String[] args) {Animal animal = new Animal();animal.makeSound(); // 输出:动物发出声音...Animal dog = new Dog(); // 多态实例化dog.makeSound(); // 输出:汪汪汪...}
}
4.3 抽象类与接口
4.3.1 抽象类
抽象类(Abstract Class) 是不能直接实例化的类,它主要用于被其他类继承。抽象类可以包含抽象方法(没有具体实现的方法),子类必须实现这些抽象方法才能实例化。
abstract class Shape {abstract void draw();void color(String color) {System.out.println("形状被填充为" + color);}
}class Circle extends Shape {@Overridevoid draw() {System.out.println("绘制圆形");}
}public class Main {public static void main(String[] args) {Shape circle = new Circle();circle.draw(); // 输出:绘制圆形circle.color("红色"); // 输出:形状被填充为红色}
}
4.3.2 接口
接口(Interface) 定义了一组方法,这些方法在接口中没有具体的实现,它们只提供了一个规范。类可以实现接口,从而承诺会提供接口中所有方法的具体实现。
interface AnimalActions {default void sleep() {System.out.println("动物正在睡觉...");}void eat();
}class Cat implements AnimalActions {@Overridepublic void eat() {System.out.println("猫正在吃鱼...");}
}public class Main {public static void main(String[] args) {Cat cat = new Cat();cat.sleep(); // 输出:动物正在睡觉...cat.eat(); // 输出:猫正在吃鱼...}
}
自Java 8开始,接口还可以包含默认方法(default method)和静态方法(static method),增强了接口的功能性和灵活性。
4.4 包与访问控制
Java中的包(package)是一种组织类的方式,有助于避免命名冲突并提供访问控制。访问控制主要通过public
、protected
、default
(无修饰符)、private
四种访问修饰符进行管理。
package com.example.animals;public class Dog {protected String breed;// ...
}// 在另一个包下的类中引用Dog类
package com.example.users;import com.example.animals.Dog;public class PetOwner {Dog petDog = new Dog();// petDog.breed 可以访问,因为protected成员在不同包的子类中可见
}
至此,我们已经深入探讨了面向对象编程的基本概念和核心特性。理解和掌握这些知识点对于后续Java学习至关重要,它们构成了构建复杂软件系统的基石。在接下来的学习中,我们将进一步探索更高级的主题和实际应用场景。