• Java基础之-OOP面向对象


    目录

    面向对象三大特征

    封装

    继承

    多态

    面向对象

    Object Oriented Programming(面向对象)

    面向对象三大特征

    封装

    利用抽象数据类型将基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使其与之外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
    优点
    减轻维护的负担可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
    有效的调节性能可以通过剖析确定哪些模块影响了系统的性能
    提高软件的可重用性
    降低了构建大型系统的风险即使整个系统不可用,但是这些独立的模块却有可能是可用的
    减少耦合可以独立地开发、测试、优化、使用、理解和修改

    以下 Person 类封装 name、gender、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。

    注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改 gender 属性使用的数据类型时,也可以在不影响客户端代码的情况下进行。

    1. public class Person {
    2.    private String name;
    3.    private int gender;
    4.    private int age;
    5.    public String getName() {
    6.        return name;
    7.   }
    8.    public String getGender() {
    9.        return gender == 0 ? "man" : "woman";
    10.   }
    11.    public void work() {
    12.        if (18 <= age && age <= 50) {
    13.            System.out.println(name + " is working very hard!");
    14.       } else {
    15.            System.out.println(name + " can't work any more!");
    16.       }
    17.   }
    18. }

    继承

    继承实现了  IS-A  关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。 继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。 Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为  向上转型 。
    Animal animal = new Cat();

    里氏替换原则:在面向对象的程序设计中,里氏替换原则(Liskov Substitution principle)是对子类型的特别定义。它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为“数据的抽象与层次”的演说中首先提出。内容可以描述为: “派生类(子类)对象可以在程式中代替其基类(超类)对象。” 以上内容并非利斯科夫的原文,而是译自罗伯特·马丁(Robert Martin)对原文的解读。 (摘自百度百科-里氏替换原则简介)

    多态

    多态分为编译时多态和运行时多态:

    编译时多态主要指方法的重载
    运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定

    运行时多态有三个条件:

    继承
    覆盖(重写)
    向上转型

    下面的代码中,乐器类(Instrument)有两个子类: Wind 和 Percussion,它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。

    1. package xin.yi.test01.运行时多态;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. *@program: bi_shi_test
    6. *@description: 向上转型
    7. *@author: xin yi
    8. *@create: 2022-07-29 10:02
    9. */
    10. public class Music {
    11.    public static void main(String[] args) {
    12.        List instruments = new ArrayList<>();
    13.        Instrument wind = new Wind();
    14.        Instrument percussion = new Percussion();
    15.        instruments.add(wind);
    16.        instruments.add(percussion);
    17.        instruments.forEach(x->x.play());
    18.   }
    19. }
    1. package xin.yi.test01.运行时多态;
    2. /**
    3. *@program: bi_shi_test
    4. *@description: 子类
    5. *@author: xin yi
    6. *@create: 2022-07-29 10:01
    7. */
    8. public class Percussion extends Instrument {
    9.    public void play() {
    10.        System.out.println("Percussion is playing...");
    11.   }
    12. }
    1. package xin.yi.test01.运行时多态;
    2. /**
    3. *@program: bi_shi_test
    4. *@description: 子类
    5. *@author: xin yi
    6. *@create: 2022-07-29 10:01
    7. */
    8. public class Wind extends Instrument {
    9.    public void play() {
    10.        System.out.println("Wind is playing...");
    11.   }
    12. }
    1. package xin.yi.test01.运行时多态;
    2. /**
    3. *@program: bi_shi_test
    4. *@description: 父类
    5. *@author: xin yi
    6. *@create: 2022-07-29 09:59
    7. */
    8. public class Instrument {
    9. public void play() {
    10. System.out.println("Instrument is playing...");
    11. }
    12. }
    控制台输出
    1. Wind is playing...
    2. Percussion is playing...

  • 相关阅读:
    卧槽,Log4j2 再爆雷,Log4j v2.17.0 横空出世。。。
    day-58 代码随想录算法训练营(19)单调栈 part 01
    ubuntu 查询流量使用
    java——事务
    Dubbo SPI扩展机制源码详解(基于2.7.10)
    Codeforces Round 674
    【无标题】放大放大放大
    分享5款.NET开源免费的Redis客户端组件库
    C/C++语言100题练习计划 95——矩阵交换行(线性代数)
    ThingsBoard的数据分析-自定义节点来订阅kafka stream的消息
  • 原文地址:https://blog.csdn.net/qq_40629687/article/details/126051147