Java 面向对象编程的三大法宝:封装、继承与多态

简介: 本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。

 目录

一、封装:数据的保护罩

(一)为啥要封装

(二)代码示例

二、继承:代码复用的神器

(一)继承的好处

(二)代码示例

三、多态:灵活多变的编程技巧

(一)多态的魅力

(二)代码示例


宝子们,今天咱来唠唠 Java 中面向对象编程里超级重要的三个概念:封装、继承和多态。这仨就像是编程世界里的魔法咒语,掌握了它们,你的代码就能变得更加灵活、可维护和强大。

一、封装:数据的保护罩

(一)为啥要封装

想象一下,你有一个装满宝贝(数据)的盒子,你肯定不希望别人随便乱动里面的东西,对吧?封装就是干这个事儿的。它把数据和操作这些数据的方法包在一起,只对外暴露一些必要的接口,这样就能保证数据的安全性和完整性。比如说,你有一个代表银行账户的类,账户余额这个数据肯定不能让随便谁都能修改,封装就能帮你控制对余额的访问。

(二)代码示例

class BankAccount {
    // 账户余额,用 private 修饰,这就是把它藏起来,不让外面随便访问
    private double balance;
    // 存款方法,这是对外提供的操作余额的接口
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("成功存入 " + amount + ",当前余额为 " + balance);
        } else {
            System.out.println("存款金额必须大于 0");
        }
    }
    // 取款方法,也是接口之一
    public void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            System.out.println("成功取出 " + amount + ",当前余额为 " + balance);
        } else {
            System.out.println("余额不足或取款金额不正确");
        }
    }
    // 查看余额的方法,这个可以让外界获取余额信息,但不能修改
    public double getBalance() {
        return balance;
    }
}
public class EncapsulationExample {
    public static void main(String[] args) {
        BankAccount myAccount = new BankAccount();
        myAccount.deposit(1000);
        myAccount.withdraw(500);
        // 只能通过 get 方法获取余额,不能直接修改 balance
        System.out.println("当前余额:" + myAccount.getBalance());
    }
}

image.gif

在这个例子里,balanceprivate 修饰,外界无法直接访问和修改它,只能通过 depositwithdrawgetBalance 这些方法来间接操作,这就是封装的体现,是不是很巧妙?

二、继承:代码复用的神器

(一)继承的好处

继承就像是家族遗传,子类可以继承父类的属性和方法,这样就不用重复写很多代码啦。比如说,你有一个 Animal 类,它有一些通用的属性和行为,像名字、年龄和吃东西的方法。然后你又有 Dog 类和 Cat 类,它们都是动物,就可以继承 Animal 类,不用再重新定义那些通用的东西,只需要专注于自己特有的属性和行为,比如狗会摇尾巴,猫会抓老鼠。

(二)代码示例

// 父类 Animal
class Animal {
    private String name;
    private int age;
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 动物吃东西的方法
    public void eat() {
        System.out.println(name + " 正在吃东西");
    }
    // 这里是 get 和 set 方法,用于访问和修改私有属性
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
// 子类 Dog,继承自 Animal
class Dog extends Animal {
    // 狗特有的行为,摇尾巴
    public void wagTail() {
        System.out.println(getName() + " 正在摇尾巴");
    }
    public Dog(String name, int age) {
        // 调用父类的构造方法初始化父类的属性
        super(name, age);
    }
}
// 子类 Cat,也继承自 Animal
class Cat extends Animal {
    // 猫特有的行为,抓老鼠
    public void catchMouse() {
        System.out.println(getName() + " 正在抓老鼠");
    }
    public Cat(String name, int age) {
        super(name, age);
    }
}
public class InheritanceExample {
    public static void main(String[] args) {
        Dog myDog = new Dog("旺财", 3);
        myDog.eat();
        myDog.wagTail();
        Cat myCat = new Cat("咪咪", 2);
        myCat.eat();
        myCat.catchMouse();
    }
}

image.gif

宝子们看,DogCat 类继承了 Animal 类,复用了 Animal 类的属性和方法,同时又有自己独特的行为,这样代码是不是简洁多了?

三、多态:灵活多变的编程技巧

(一)多态的魅力

多态就像是孙悟空的七十二变,同一个行为,不同的对象可以有不同的表现形式。比如说,动物都有叫的行为,但狗叫是 “汪汪”,猫叫是 “喵喵”。通过多态,我们可以用一个父类的引用指向不同的子类对象,然后调用相同的方法,却能得到不同的结果,这样代码就更加灵活和可扩展啦。

(二)代码示例

// 还是之前的 Animal、Dog 和 Cat 类
// 定义一个方法,参数是 Animal 类型,这样就可以传入 Animal 的子类对象
public static void makeAnimalSound(Animal animal) {
    animal.eat();
    // 通过 instanceof 关键字判断对象的实际类型,然后调用相应的特有方法
    if (animal instanceof Dog) {
        ((Dog) animal).wagTail();
    } else if (animal instanceof Cat) {
        ((Cat) animal).catchMouse();
    }
}
public class PolymorphismExample {
    public static void main(String[] args) {
        Dog myDog = new Dog("大黄", 4);
        Cat myCat = new Cat("小花", 3);
        makeAnimalSound(myDog);
        makeAnimalSound(myCat);
    }
}

image.gif

在这个例子里,makeAnimalSound 方法的参数是 Animal 类型,但我们可以传入 DogCat 的对象,根据对象的实际类型,会执行不同的行为,这就是多态的神奇之处。

宝子们,封装、继承和多态是 Java 面向对象编程的精髓所在,掌握了它们,你就能写出更加优雅、高效、易维护的代码。刚开始可能会觉得有点绕,但多写多练,你一定会爱上这三个编程魔法的!如果有啥不明白的地方,随时回来看看这篇文章,或者在评论区问我哦。

相关文章
|
5月前
|
Java 编译器 程序员
java中重载和多态的区别
本文详细解析了面向对象编程中多态与重载的概念及其关系。多态是OOP的核心,分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过方法重载和运算符重载实现,如Java中的同名方法因参数不同而区分;运行时多态则依赖继承和方法重写,通过父类引用调用子类方法实现。重载是多态的一种形式,专注于方法签名的多样性,提升代码可读性。两者结合增强了程序灵活性与扩展性,帮助开发者更好地实现代码复用。
208 0
|
6月前
|
人工智能 JSON Java
列表结构与树结构转换分析与工具类封装(java版)
本文介绍了将线性列表转换为树形结构的实现方法及工具类封装。核心思路是先获取所有根节点,将其余节点作为子节点,通过递归构建每个根节点的子节点。关键在于节点需包含 `id`、`parentId` 和 `children` 三个属性。文中提供了两种封装方式:一是基于基类 `BaseTree` 的通用工具类,二是使用函数式接口实现更灵活的方式。推荐使用后者,因其避免了继承限制,更具扩展性。代码示例中使用了 Jackson 库进行 JSON 格式化输出,便于结果展示。最后总结指出,理解原理是进一步优化和封装的基础。
195 0
|
7月前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
7月前
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
|
8月前
|
Java 数据安全/隐私保护 开发者
【潜意识Java】深入理解 Java 面向对象编程(OOP)
本文介绍了Java中的面向对象编程(OOP)核心概念,包括封装、继承、多态和抽象。封装通过访问控制保护数据,提高安全性;继承支持代码复用,减少冗余;多态实现灵活的行为调用;抽象则隐藏细节,简化接口设计。掌握这些概念有助于编写高效、灵活且易于维护的代码。文章通过实例详细讲解了每个概念在Java中的应用,并总结了它们的优势。
354 3
|
10月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
884 60
|
搜索推荐 Java 编译器
【Java探索之旅】多态:重写、动静态绑定
【Java探索之旅】多态:重写、动静态绑定
109 0
|
Java 程序员 C++
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(3)
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(3)
274 0
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(3)
|
Java 编译器
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(2)
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(2)
211 0
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(2)
|
Java 编译器 数据库
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(1)
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(1)
137 0
java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super(1)