java面向对象(附代码详解)

你想深入理解 Java 中的面向对象编程(OOP),这是 Java 编程的核心思想,我会从基础概念到核心特性,用通俗易懂的方式给你讲清楚。

一、面向对象的核心思想

首先,先理解「面向对象」到底是什么:

  • 对比理解:传统的「面向过程」是按步骤写代码(比如 “先登录、再查数据、再展示”),关注 “怎么做”;
  • 面向对象是把问题拆分成一个个「对象」(比如 “用户对象、订单对象、商品对象”),关注 “谁来做”,每个对象都有自己的属性和行为,通过对象之间的交互完成功能。

面向对象有 4 个核心特性:封装、继承、多态、抽象,这是理解的关键。

二、面向对象的基础概念

1. 类(Class)与对象(Object)

这是 OOP 的最基础概念,先搞懂这两个的关系:

  • :是「模板 / 蓝图」,定义了一类事物的共同属性和行为。比如 “人类” 这个类,属性有姓名、年龄,行为有吃饭、走路。
  • 对象:是类的「具体实例」。比如 “张三” 就是 “人类” 这个类的一个对象,有具体的姓名(张三)、年龄(20)。

代码示例(类和对象)

// 定义一个「人类」类(模板)
public class Person {
    // 1. 属性(成员变量):描述对象的特征
    String name; // 姓名
    int age;     // 年龄

    // 2. 行为(方法):描述对象能做的事
    public void eat() {
        System.out.println(name + "在吃饭");
    }

    public void run() {
        System.out.println(name + "在跑步,年龄:" + age);
    }

    // 主方法:测试代码
    public static void main(String[] args) {
        // 创建「人类」的具体对象(实例化)
        Person zhangsan = new Person();
        // 给对象赋值属性
        zhangsan.name = "张三";
        zhangsan.age = 20;
        // 调用对象的方法
        zhangsan.eat();  // 输出:张三在吃饭
        zhangsan.run();  // 输出:张三在跑步,年龄:20

        // 再创建一个对象
        Person lisi = new Person();
        lisi.name = "李四";
        lisi.age = 25;
        lisi.eat(); // 输出:李四在吃饭
    }
}
2. 封装(Encapsulation)

核心是「隐藏内部细节,只暴露必要的接口」,目的是保证数据安全。

  • 做法:
    1. 将类的属性用 private 修饰(私有),外部不能直接访问;
    2. 提供 publicgetter/setter 方法,供外部访问 / 修改属性;
    3. 可以在 setter 中加逻辑校验,避免非法数据。

代码示例(封装)

public class Person {
    // 1. 属性私有化
    private String name;
    private int age;

    // 2. 提供getter(获取属性)和setter(修改属性)方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    // 在setter中加校验:年龄不能小于0
    public void setAge(int age) {
        if (age < 0) {
            System.out.println("年龄不能为负数,默认设为0");
            this.age = 0;
        } else {
            this.age = age;
        }
    }

    // 普通方法
    public void introduce() {
        System.out.println("我叫" + name + ",今年" + age + "岁");
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("王五");
        person.setAge(-5); // 触发校验,输出:年龄不能为负数,默认设为0
        person.introduce(); // 输出:我叫王五,今年0岁
    }
}
3. 继承(Inheritance)

核心是「代码复用」,让子类继承父类的属性和方法,子类还能扩展自己的功能。

  • 关键字:extends
  • 规则:
    1. Java 是单继承(一个子类只能继承一个父类),但可以多层继承;
    2. 子类不能继承父类的 private 属性 / 方法,但可以通过父类的 public 方法间接访问;
    3. 父类的构造方法不能继承,但子类构造方法会默认调用父类的无参构造。

代码示例(继承)

// 父类:人类(基类/超类)
public class Person {
    protected String name; // protected:子类可以直接访问
    protected int age;

    public void eat() {
        System.out.println(name + "在吃饭");
    }
}

// 子类:学生类(派生类),继承Person
public class Student extends Person {
    // 子类扩展自己的属性
    private String studentId; // 学号

    // 子类扩展自己的方法
    public void study() {
        System.out.println(name + "(学号:" + studentId + ")在学习");
    }

    // 重写父类方法(方法重写是多态的基础)
    @Override
    public void eat() {
        System.out.println(name + "在食堂吃饭");
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.name = "赵六"; // 直接访问父类的protected属性
        student.studentId = "2024001";
        student.eat(); // 调用重写后的方法,输出:赵六在食堂吃饭
        student.study(); // 输出:赵六(学号:2024001)在学习
    }
}
4. 多态(Polymorphism)

核心是「一个事物多种形态」,允许父类引用指向子类对象,调用方法时自动执行子类的实现。

  • 实现条件:
    1. 有继承关系;
    2. 子类重写父类方法;
    3. 父类引用指向子类对象。
  • 好处:降低代码耦合,提高扩展性。

代码示例(多态)

// 父类
public class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

// 子类1:狗
public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("小狗汪汪叫");
    }
}

// 子类2:猫
public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("小猫喵喵叫");
    }
}

// 测试多态
public class TestPolymorphism {
    public static void main(String[] args) {
        // 父类引用指向子类对象
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();

        // 调用方法时,自动执行子类的实现
        animal1.makeSound(); // 输出:小狗汪汪叫
        animal2.makeSound(); // 输出:小猫喵喵叫

        // 多态的优势:新增子类(如Bird),无需修改下面的方法
        makeAnimalSound(new Dog());
        makeAnimalSound(new Cat());
    }

    // 统一的方法,接收所有Animal子类对象
    public static void makeAnimalSound(Animal animal) {
        animal.makeSound();
    }
}
5. 抽象(Abstraction)

核心是「隐藏具体实现,只定义规范」,用抽象类或接口实现。

  • 抽象类abstract class):
    1. 不能实例化(不能 new),只能被继承;
    2. 可以包含抽象方法(只有方法签名,没有实现)和普通方法;
    3. 子类必须实现抽象类的所有抽象方法(除非子类也是抽象类)。
  • 接口interface):
    1. 比抽象类更 “抽象”,所有方法默认是 public abstract(JDK8+ 支持默认方法);
    2. 类可以实现多个接口(弥补 Java 单继承的不足);
    3. 常用于定义 “行为规范”。

代码示例(抽象类)

// 抽象类:定义“交通工具”的规范
public abstract class Vehicle {
    // 普通方法
    public void fuel() {
        System.out.println("需要加油/充电");
    }

    // 抽象方法:子类必须实现
    public abstract void run();
}

// 子类1:汽车
public class Car extends Vehicle {
    @Override
    public void run() {
        System.out.println("汽车在公路上跑");
    }
}

// 子类2:自行车
public class Bicycle extends Vehicle {
    @Override
    public void run() {
        System.out.println("自行车靠人力蹬着跑");
    }

    public static void main(String[] args) {
        // Vehicle v = new Vehicle(); // 报错:抽象类不能实例化
        Vehicle car = new Car();
        car.run(); // 输出:汽车在公路上跑
        car.fuel(); // 输出:需要加油/充电
    }
}

代码示例(接口)

// 接口:定义“会飞”的行为规范
public interface Flyable {
    void fly(); // 抽象方法,默认public abstract
}

// 接口:定义“会游泳”的行为规范
public interface Swimmable {
    void swim();
}

// 类实现多个接口
public class Duck implements Flyable, Swimmable {
    @Override
    public void fly() {
        System.out.println("鸭子低空飞行");
    }

    @Override
    public void swim() {
        System.out.println("鸭子在水里游");
    }

    public static void main(String[] args) {
        Duck duck = new Duck();
        duck.fly();
        duck.swim();
    }
}

三、面向对象的其他重要补充

  1. 构造方法:创建对象时自动调用,用于初始化对象。
    • 名称必须和类名相同,无返回值(连 void 都没有);
    • 如果不写构造方法,JVM 会默认提供无参构造;如果写了有参构造,默认无参构造会失效。
  2. this 关键字:指代当前对象,用于区分成员变量和局部变量。
  3. super 关键字:指代父类对象,用于调用父类的属性、方法或构造方法。

总结

Java 面向对象的核心可以总结为 3 个关键点:

  1. 基础核心:类是模板,对象是实例,所有功能都围绕 “对象” 展开;
  2. 四大特性:封装(隐藏细节)、继承(复用代码)、多态(灵活扩展)、抽象(定义规范);
  3. 核心价值:让代码更易维护、易扩展、易复用,符合大型项目的开发逻辑。

如果有具体的知识点(比如构造方法、接口和抽象类的区别)想深入了解,可以告诉我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值