面向对象编程(OOP)是Java语言的核心特性。本文将系统讲解Java面向对象的基础和高级特性,帮助读者构建完整的知识体系。所有示例代码都经过验证,适合大二学生理解与实践。
核心思想:将现实世界的事物抽象为对象,通过对象之间的交互来解决问题
对象:现实事物的抽象(如:学生张三)
类:对象的模板(如:Student类)
三大特征:
封装:隐藏对象内部实现细节
继承:代码复用与扩展
多态:同一操作作用于不同对象产生不同行为
类结构:
[访问修饰符] class 类名 {
// 成员变量(描述状态)
// 构造方法(初始化对象)
// 成员方法(描述行为)
}
内存图解:
栈内存:存储对象引用
堆内存:存储对象实例
方法区:存储类信息
示例代码:
// 类定义
public class Student {
// 成员变量(属性)
private String name; // 状态
private int age;
// 成员方法(行为)
public void study(String subject) {
System.out.println(name + "正在学习" + subject);
}
}
// 创建对象(实例化)
Student stu = new Student(); // new关键字触发内存分配
访问控制本质:控制类的可见性和修改范围,实现封装特性
修饰符 | 类内 | 包内 | 子类 | 任意位置 | 使用场景 |
---|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ | 内部实现细节保护 |
default | ✅ | ✅ | ❌ | ❌ | 包内共享 |
protected | ✅ | ✅ | ✅ | ❌ | 子类继承访问 |
public | ✅ | ✅ | ✅ | ✅ | 对外提供的公共服务 |
选择原则:
封装的意义:
标准实现:
public class BankAccount {
private String accountNumber; // 私有化字段
private double balance;
// 对外暴露的存取方法
public double getBalance() {
return balance;
}
public void deposit(double amount) {
if(amount > 0) {
balance += amount;
}
}
public void withdraw(double amount) {
if(amount > 0 && amount <= balance) {
balance -= amount;
}
}
}
核心作用:对象初始化,确保对象创建后处于合法状态
特点:
内存初始化流程:
示例:
public class Book {
private String title;
private String author;
// 默认构造方法(建议保留)
public Book() {
this("未知书名", "未知作者");
}
// 全参构造方法
public Book(String title, String author) {
this.title = title;
this.author = author;
}
}
三种用法:
内存原理:
public class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x; // 区分同名变量
this.y = y;
}
public Point() {
this(0, 0); // 调用其他构造方法
}
public Point getThis() {
return this; // 返回当前对象
}
}
核心特性:
使用场景:
内存分配:
public class AppConfig {
// 静态常量
public static final String VERSION = "1.0";
// 静态变量
private static int accessCount = 0;
// 静态代码块(类加载时执行)
static {
System.out.println("初始化配置...");
}
// 静态方法
public static void recordAccess() {
accessCount++;
}
}
继承的本质:建立类与类之间的"is-a"关系(如Cat is an Animal)
优势:
继承限制:
class Animal {
String name;
void eat() {
System.out.println(name + "正在进食");
}
}
class Cat extends Animal {
void climbTree() {
System.out.println(name + "在爬树"); // 继承父类name
}
}
与重载(Overload)的区别:
方法重写 | 方法重载 | |
---|---|---|
所在类 | 父子类之间 | 同一个类中 |
方法名 | 相同 | 相同 |
参数列表 | 相同 | 不同 |
返回类型 | 相同或是子类 | 可不同 |
访问权限 | 不能比父类更严格 | 无关 |
异常类型 | 不能抛出更宽泛的检查型异常 | 无关 |
@Override注解的作用:
class Animal {
protected void move() {
System.out.println("动物移动");
}
}
class Bird extends Animal {
@Override // 显式声明重写
public void move() { // 扩大访问权限
System.out.println("鸟儿飞翔");
}
}
重要方法解析:
toString()
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
equals()
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
hashCode()
三种用法:
class Employee {
String name = "员工";
public Employee(String name) {
this.name = name;
}
}
class Manager extends Employee {
String name = "经理";
public Manager() {
super("默认经理"); // 调用父类构造
}
void showNames() {
System.out.println(super.name); // 访问父类属性
System.out.println(this.name); // 访问子类属性
}
}
三种应用场景:
final类:禁止继承(如String类)
public final class Constants {
// 工具类设计
}
final方法:禁止子类重写
public class Parent {
public final void importantMethod() {
// 核心算法实现
}
}
final变量:只能赋值一次
// 基本类型:值不可变
final int MAX_VALUE = 100;
// 引用类型:引用不可变
final List<String> NAMES = new ArrayList<>();
NAMES.add("Tom"); // 允许,修改的是对象内容
// NAMES = new ArrayList<>(); // 编译错误
核心特征:
适用场景:
abstract class Graphic {
// 抽象方法
public abstract double area();
// 具体方法
public void printArea() {
System.out.println("面积:" + area());
}
}
class Circle extends Graphic {
private double radius;
@Override
public double area() {
return Math.PI * radius * radius;
}
}
演进历程:
核心特性:
与抽象类的区别:
抽象类 | 接口 | |
---|---|---|
构造方法 | 有 | 无 |
成员变量 | 任意类型 | 默认public static final |
方法实现 | 可以有具体方法 | Java8+支持默认方法 |
继承方式 | 单继承 | 多实现 |
设计目的 | 代码复用 | 定义行为规范 |
// 接口定义
interface Flyable {
// 常量
double MAX_SPEED = 1000; // 默认public static final
// 抽象方法
void takeoff(); // 默认public abstract
// 默认方法
default void emergencyLanding() {
System.out.println("紧急迫降");
}
}
// 接口继承
interface AdvancedFlyable extends Flyable {
void supersonicFly();
}
// 类实现
class Airplane implements AdvancedFlyable {
@Override
public void takeoff() {
System.out.println("滑行起飞");
}
@Override
public void supersonicFly() {
System.out.println("超音速飞行");
}
}
转型规则:
转型应用场景:
Animal animal = new Cat(); // 向上转型
animal.eat(); // 调用父类方法
if(animal instanceof Cat) {
Cat cat = (Cat)animal; // 向下转型
cat.catchMouse(); // 调用子类特有方法
}
实现机制:
JVM实现原理:
多态优势:
class Animal {
public void move() {
System.out.println("动物移动");
}
}
class Fish extends Animal {
@Override
public void move() {
System.out.println("鱼儿游动");
}
}
class Bird extends Animal {
@Override
public void move() {
System.out.println("鸟儿飞翔");
}
}
// 测试类
public class Test {
public static void main(String[] args) {
Animal[] animals = new Animal[3];
animals[0] = new Animal();
animals[1] = new Fish();
animals[2] = new Bird();
for(Animal a : animals) {
a.move(); // 同一方法不同表现
}
}
}
四大类型:
使用场景:
// 成员内部类
class Outer {
private int num = 10;
class Inner {
void show() {
System.out.println(num); // 直接访问外部类私有成员
}
}
}
// 匿名内部类
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击");
}
});
// 静态内部类
class Map {
static class Entry {
// 不依赖外部类实例
}
}
动物管理系统:
abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public abstract void sound();
public String getName() {
return name;
}
}
interface Swimmable {
void swim();
}
class Dolphin extends Animal implements Swimmable {
public Dolphin(String name) {
super(name);
}
@Override
public void sound() {
System.out.println("超声波");
}
@Override
public void swim() {
System.out.println(getName() + "在海中遨游");
}
}
public class Zoo {
public static void main(String[] args) {
Animal animal = new Dolphin("泡泡");
animal.sound();
if(animal instanceof Swimmable) {
((Swimmable)animal).swim();
}
}
}