【左手代码右手诗】JAVA学习第七篇:面向对象三大特性

本文详细介绍了面向对象编程的三大核心特性:封装、继承和多态。封装是将代码和数据结合成对象,保护内部信息并提供公共接口。继承允许子类继承父类的属性和方法,提高代码复用性。多态则实现了接口的多种实现方式,增强了程序的灵活性。这些特性使得面向对象编程更适应大型软件开发,提高了代码的可维护性和扩展性。
摘要由CSDN通过智能技术生成

前言
面向对象:
​ 一种基于面向过程的新编程思想,顾名思义就是该思想是站在对象的角度思考问题,我们把多个功能合理放到不同对象里,强调的是具备某些功能的对象。
具备某种功能的实体,称为对象。面向对象最小的程序单元是:类。面向对象更加符合常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。
在软件工程上,面向对象可以使工程更加模块化,实现更低的耦合和更高的内聚。
面向对象开发模式更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率。
该开发模式之所以使程序设计更加完善和强大,主要是因为面向对象具有继承、封装和多态 3 个核心特性。
在这里插入图片描述



一、封装

1、概念

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。

说白了,封装就相当于一个“黑盒子”,程序员将一堆公共功能的实现逻辑代码装到里面去,然后提供一些接口让你可以使用它,比如充电宝,你要充电的时候直接用数据线插入充电宝的USB接口就行了,不用的时候拔掉就行,我们只知道充电宝有充电和放电的功能,根本不需要关心充电宝里面的零部件都是些什么玩意儿。

封装对于用户,就是用它的人来说是很便捷的,但对于设计者,就是根据封装思想设计产品给大众使用的开发者来说是痛苦的。用好封装是程序员必备的技能点。

2、封装的作用

1、保护类中的信息,它可以阻止在外部定义的代码随意访问内部代码和数据。
2、隐藏细节信息,一些不需要程序员修改和使用的信息,把它隐藏起来,比如取款机中的键盘,用户只需要知道按哪个键实现什么操作就可以,至于它内部是如何运行的,用户不需要知道。
3、有助于建立各个系统之间的松耦合关系,提高系统的独立性。当一个系统的实现方式发生变化时,只要它的接口不变,就不会影响其他系统的使用。例如 U 盘,不管里面的存储方式怎么改变,只要 U 盘上的 USB 接口不变,就不会影响用户的正常操作。六个字:低耦合,高内聚
4、提高软件的复用率,降低成本。每个系统都是一个相对独立的整体,可以在不同的环境中得到使用。例如,一个 U 盘可以在多台电脑上使用。

3、封装的实现

在这里插入图片描述
注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,比较标准。

a、访问修饰符

在这里插入图片描述

从上到下封装性越来越强

b、this关键字

this关键字代表当前对象:
this.属性:操作当前对象的属性;
this.方法:调用当前对象的方法。

封装对象的属性的时候,经常会使用this关键字。当getter和setter函数参数名和成员函数名重合的时候,可以使用this****区别。

在这里插入图片描述


二、继承

前些年有一部韩剧非常的火,叫继承者们,应该是在将富二代们为了继承家产而引起的血雨腥风的故事。

在这里插入图片描述
一提到继承,首先想到的就是继承家产,继承皇位,继承人,被继承人…
JAVA中的继承其实也差不多就是这个意思。
如同生活中的子女继承父母拥有的所有财产,程序中的继承性是指子类拥有父类数据结构的方法和机制,这是类之间的一种关系;继承只能是单继承。
例如:
在这里插入图片描述
学生继承了人(父类)的属性和行为,但他又有自己独有的属性和行为,老师继承了人的属性和行为,但他也有自己独有的属性和行为。

1、继承的目的

继承最主要的目的就是提高代码的复用性和扩展性,以前比如编写一个老师类和学生类,他们都有名字,性别,年龄,都会上课,睡觉,吃饭。一样的东西重复的写,不划算,我直接再定义一个父类:人,把老师和学生相同的属性和行为的描述我放到父类里面,然后老师和学生类继承父类就行了,现在我只用写一遍公用代码就行了,再添加一个班主任类,也直接继承就行了,多方便。

1、继承的实现

a、语法规则

在这里插入图片描述

b、方法的重写

子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写。当调用方法时会优先调用子类的方法。

注意:返回值类型,方法名,参数类型与个数甚至顺序都要和父类方法相同才能实现重写

重载和重写的区别

方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。
方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。

c、继承的初始化顺序

1、初始化父类再初始化子类
2、先执行初始化对象中属性,再执行构造方法中的初始化。
基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:

父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法

下面有个形象的图:

在这里插入图片描述
我们前面讲到了对象的初始化有多种形式以及执行的顺序:静态代码块——>实例代码块——>构造方法

这里差不多也就是这个意思,如果不明白的可以看看我前面的篇章。

c、final关键字

使用final关键字做标识有“最终的”含义。
  1. final 修饰类,则该类不允许被继承。
  2. final 修饰方法,则该方法不允许被覆盖(重写)。
  3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!)且初始化之后就不能改了,只能赋值一次。
  4. final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。

d、super关键字

在对象的内部使用,可以代表父类对象。

1、访问父类的属性:super.age

2、访问父类的方法:super.eat()

super的应用:

首先我们知道子类的构造的过程当中必须调用父类的构造方法。其实这个过程已经隐式地使用了我们的super关键字。

这是因为如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。

那么如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。

要注意的是:如果子类构造方法中既没有显示调用父类的构造方法,而父类没有无参的构造方法,则编译出错。

(补充说明,虽然没有显示声明父类的无参的构造方法,系统会自动默认生成一个无参构造方法,但是,如果你声明了一个有参的构造方法,而没有声明无参的构造方法,这时系统不会动默认生成一个无参构造方法,此时称为父类有没有无参的构造方法。)


三、多态

1、概念

面向对象的多态性,即“一个接口,多个方法”。多态性体现在父类中定义的属性和方法被子类继承后,可以具有不同的属性或表现方式(方法的重写,子类外增的属性)。多态性允许一个接口被多个同类使用,弥补了单继承的不足。

2、多态的好处

可替换性(substitutability)。多态对已存在代码具有可替换性。

可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。

接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。

灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。

简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

3、多态的实现

A、引用多态

父类的引用可以指向本类的对象;
父类的引用可以指向子类的对象;

这两句话是什么意思呢,让我们用代码来体验一下,首先我们创建一个父类Animal和一个子类Dog,在主函数里如下所示:
在这里插入图片描述
这么做的好处是可以实现动态绑定:
在这里插入图片描述

在这里插入图片描述

B、方法多态

根据上述创建的两个对象:本类对象和子类对象,同样都是父类的引用,当我们指向不同的对象时,它们调用的方法也是多态的。

创建本类对象时,调用的方法为本类方法;

创建子类对象时,调用的方法为子类重写的方法或者继承的方法;

使用多态的时候要注意:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法!!!

注意:== 继承是多态的基础。多态的最终目的就是使得程序在运行中,具备动态选择代码执行的能力。


总结

本文主要对面向对象的三大特性展开了详细的讲解,这也是面向对象最核心的部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无树菩提~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值