封装、继承、多态!适合有编程基础的人看的《韩顺平零基础30天学java》笔记(P281~328)

写在最前边:

研究生一枚,为后端实习和未来工作打基础。无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了。
韩顺平老师课程地址:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0
阅读提醒:本笔试适合有编程语言基础的伙伴阅读,因为本兔兔是本专业的,有c、c++、python 、sql基础,笔记中特别的基础的内容就没有记录。完全零基础的小伙伴建议跟着韩老师的课程自己记录。

Java 基础

第二阶段 java编程

第八章 面向对象编程(中级)

面向对象三大特征:封装、继承、多态
※三、封装重要
概念
  • 封装的内容: 抽象出来的数据属性,和对数据的操作方法封装起来。

  • 封装的目的: 使得数据在内部,只有授权之后才可以通过操作方法对内部数据进行操作

  • 例子:对电视机饿的操作

  • 好处:隐藏实现细节(如连接数据库)、可以对数据进行验证,保证安全合理

步骤

1、属性 使用 private 私有化。注意有些可以让大家看的属性可以设成public
2、提供publicsetXXX()方法,可以对某个属性进行判断和赋值、对输入数据进行校验
在这里插入图片描述
3、提供publicgetXXX()方法,可以对获取某个属性值。这里可以增加权限判断,在响应权限内才能返回这个属性值。
在这里插入图片描述>get和set创建在IDEA中可以使用快捷键
Alt+Inset ,选择创建get和Set

封装与构造器结合

将Set方法添加到构造器其中,这样当初始化的时候就可以对初始化的值进行验证,避免初始化的值错误

※四、继承(代码复用性)重要
需求

在这里插入图片描述

介绍

继承可以实现代码复用。当多个类的属性和方法相似性非常高时,我们可以把这些类抽象出一个父类(超类、基类),这些类就成为子类(派生类)。子类 通过 extends来声明,直接继承父类中的属性和方法,还可以设置自己特有的属性和方法。

class 子类名 extends 父类名{
...
}
示意图在这里插入图片描述
注意

1、可以多层继承
2、间隔多层的也可以成为是父类。如B是D的父类,A也是D的父类

好处

代码复用性提高
代码的扩展性和维护性提高

本质:当子类对象创建好后,会建立属性和方法的查找关系

在这里插入图片描述
查找关系是从子类->父类->父类->…->object的查找顺序。
在某一层查询到所需属性/方法就返回信息并停止继续查询。
若查询到属性/方法是private 或默认的,也会停止继续向上查找,同时返回一个异常信息。

在这里插入图片描述
在这里插入图片描述
默认 和 private 的属性和方法是不能被查询到的,只有类提供了get方法才能通过调用方法访问
在这里插入图片描述

但是实际应用中为啥子类可以访问到父类的无修饰符的属性?

使用细节

1、子类继承了父类所有的属性和方法,但是 不能字子类中访问父类的私有属性和方法,只能通过相应方法去访问
2、子类必须调用父类的构造器,完成父类的初始化。

2.1父类中提供了无参构造器,则子类所有构造器都默认首先使用super() 调用父类的无参构造器.
2.2父类没有无参构造器子类构造器中必须使用super(参数列表)写明使用父类的哪个构造器。super(参数列表)中的参数与使用的父类构造器一致。
2.3父类既有无参构造器、又有 有参数的构造器
子类
没有使用super()显式指明应用哪个父类构造器,则默认使用父类无参构造器
否则子类使用super指明的父类构造器
super

原因很简单,“爸爸”都没出生(初始化)哪来的孩子!
super只能在构造器中使用,且必须在第一行
super和this()不能共存,因为他俩都要求在第一行
父类构造器的调用会回溯到顶级父类object为止,不是只调用直接父类
3、java中所有类都是object类的子类。ctrl + H 可以看到继承关系
4、java是单继承机制。
在这里插入图片描述
如果非要让A去继承B和C呢?那就A->B->C。妙妙秒
5、不许滥用继承,子类和父类的关系必须满足:子类 is a 父类

※四(扩充)、super详解
super 代表父类的引用,用于访问```父类``的属性、方法、构造器。
super.属性 / super.方法,不能访问父类中private的属性和方法。
super() / super(参数列表)访问父类的构造器,只能放在当前类的构造器中,且必须放在第一句,且一个构造器中只能有一个 访问父类构造器的super
super和this的区别

1、super看成指向 当前类父类的引用地址吧,只不过这个地址不需要人为更新,在查找过程中会自动向前移动。当父类属性/方法和当前类名字重复,访问父类时就需要用super。
2、this就是指向当前类对象的地址,为了把类的属性和方法和传进来的重名参数、父类的方法重名区分开来
3、直接使用属性和方法,会遵循 就近原则
在这里插入图片描述

※四(扩充)、方法重写(覆盖)
指的是当 子类的 一个方法 和 父类的一个方法,他们的
方法名、参数列表一模一样
返回类型 一致,或者子类返回类型是父类返回类型的一个子类(兼容类型)。

在这里插入图片描述

细节

在这里插入图片描述

方法重载 方法``重写

方法重载不一样在于,方法重载的判断标准没有返回类型
在这里插入图片描述

※五、多态——前提是两个对象(类)存在继承关系
需求

在这里插入图片描述

使用之前学过的技术(可以解决)

在这里插入图片描述在这里插入图片描述
但是,如果我有很多信息,主人喂了1000000只动物,难道我要在Master类中写1000000次feed的方法重载吗?

为了提升代码复用性,不用写那么多方法重载,引出多态

|
|
|

正式介绍多态
方法对象就有多种形态。多台建立在封装和继承的基础上。
instanceOf是比较操作符,用来判断对象的运行类型 是否为XX类型 ,或者XX类型的子类

在这里插入图片描述

1、方法的多态

1.1 方法重写和重载体现了多态

2、对象的多态(核心

首先脑子里要想着基本数据类型的向下兼容,即低精度可以存储在高精度中,并且后续使用时他的类型就是高精度的类型。比如
inrta = 1;
double b = a;//则此时b是1.0
对象的多态本质和基本数据类型的以上性质是类似的。子类的“精度”小于“父类”,所以子类可以“自动转换为”父类。

在这里插入图片描述
使用多态优化主人喂食程序的Master类
在这里插入图片描述

3、多态的向上转型
  • 本质:父类的引用指向子类的对象
  • 举例 Animal animal = new Dog();
  • **特点:**编译类型看左边,运行类型看右边。
    其实还是第2点中类比的基本数据类型的自动转换
  • 向上转型后的细节
    ···编译阶段
    1、可以调用父类的所有可访问的属性和方法(因为编译的类型就是父类)
    2、不能使用子类特有的属性和方法
    ···运行阶段
    1、运行结果是由子类的决定的
      方法从子类开始查找如果子类重写了方法那么方法返回的结果应该是子类里的哦。
    2、属性就看编译类型(等号左边的)!!一定注意!!
    在这里插入图片描述
4、多态的向下转型

类似基本数据类型的 强制转换,但是使用要求更加严格

  • 语法: 子类类型 引用名 = (子类类型)父类引用
  • 细节:
    ···1、强制转换的是父类类型的 引用,而不是相应的对象,对象空间一旦创建好就不可以修改!!就像人可以改名,不可以互换身体
    ···2、父类引用 必须 本来就是 当前目标类型的对象
    如果animal指向的不是Cat类对象,则不能完成向cat的向下转换在这里插入图片描述
    ···3、向下转型后可以调用子类中的所有成员
5、java的动态绑定机制非常重要
读源码的时候重要性就体现出来了

1、当调用对象方法的时候(假设想要使用sum()方法),该方法运行类型(内存地址)绑定,就是说:先去看运行类型对应的类中有没有sum(),有就用呗,没有就向上查找。
1.1方法中使用的属性, 就是用当前代码块中声明名字一致的属性,不绑定运行类型。如果没有就向上查找
1.2还是遵循不能访问子类的私有方法的规则,如果想要使用要进行强制转换
2、当调用对象属性的时候,没有动态绑定,从编译类型开始找

6、多态的应用

6.1 多态数组
即一个编译类型数组,可以存放不同运行类型的对象。
例:在这里插入图片描述
在这里插入图片描述
如果编译类型是运行类型的父类,则不能访问子类的私有方法。如果 非要访问,则需要强制类型转换。
6.2 多态参数
即形参是父类,实参可以是形参的子类。
练习题:
在这里插入图片描述

六、熟悉Object类
方法概览

在这里插入图片描述

equals方法
1、主要作用:判等
2、==和equals的对比
  • ==是比较运算符,既可以判断基本类型,也可以判断引用类型
    ···判断基本类型,是判断值相等;
    ···判断引用类型,是判断地址相等(判断是否是同一个对象)
  • equals是Object类中的方法,只能判断引用类型。
    ···默认判断地址相等(因为源码中Object类的equals方法使用 == 进行判断的)
    ···但是,子类中往往会重写equals方法,用来判断引用类型的值是否相等。如String、Integer的equals方法,是判断值是否相等
补充:idea中查看jdk源码的方法

方法1、光标在方法上,然后ctrl+b
方法2、方法1失效,配置视频地址

3、重写equals方法

举例:如果两个对象的属性值都相同,则equals返回true
注意:想要重写哪个类的equals,就是用ctrl+B定位到原本的equals方法,把他复制粘贴过来在修改代码块,省了出现错误。
在这里插入图片描述

练习题在这里插入图片描述
hashCode方法
1、API文档

在这里插入图片描述

2、六个结论
  • 提高具有哈希结构的容器的效率
  • 两个引用,指向同一对象,哈希值肯定不一样
  • 两个引用,指向不同的对象,哈希值不一样但是不肯定
  • 哈希值主要是根据地址号转换而来的一个整数,但是 哈希值地址号
  • hashCode方法也可以重写(尤其是使用集合时,一般都会重写hashCode)
toString方法
1、API文档

在这里插入图片描述

2、默认返回

包名+类型 + @ + 哈希值(hashcode方法得到的)的十六进制
在这里插入图片描述
但是可以看出来这个返回值对用户没有用呀,是有意一般子类都会重写toStirng方法

3、重写方法

1、使用快捷键 alt+Insert ->toString,把对象的属性值依次输出。
在这里插入图片描述
2、自定义返回内容

注意 直接输出一个对象时,会默认调用toString()在这里插入图片描述
finallize方法 (实际开发没人用)
1、API文档

在这里插入图片描述

2、注意细节
  • 当对象被回收时,系统自动调用该方法,子类可以重写该方法做一些释放资源的操作。
    什么时候被回收? 没有任何引用时。并不是立即回收,而是有垃圾回收的算法。程序员也可以使用System.gc()主动触发垃圾回收机制,但是不一定立即调用或者成功调用。
    资源:连接数据库的连接、打开的文件
    在这里插入图片描述
3、重写方法

原方法:在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值