写在最前边:
研究生一枚,为后端实习和未来工作打基础。无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了。
韩顺平老师课程地址:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0
阅读提醒:本笔试适合有编程语言基础的伙伴阅读,因为本兔兔是本专业的,有c、c++、python 、sql基础,笔记中特别的基础的内容就没有记录。完全零基础的小伙伴建议跟着韩老师的课程自己记录。
Java 基础
第二阶段 java编程
第八章 面向对象编程(中级)
面向对象三大特征:封装、继承、多态
※三、封装重要
概念
封装的内容: 抽象出来的数据属性,和对数据的操作方法封装起来。
封装的目的: 使得数据在内部,只有授权之后才可以通过操作方法对内部数据进行操作
例子:对电视机饿的操作
好处:隐藏实现细节(如连接数据库)、可以对数据进行验证,保证安全合理
步骤
1、
属性 使用 private 私有化
。注意有些可以让大家看的属性可以设成public
2、提供public
的setXXX()方法
,可以对某个属性进行判断和赋值、对输入数据进行校验
3、提供public
的getXXX()方法
,可以对获取某个属性值。这里可以增加权限判断,在响应权限内才能返回这个属性值。
>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、重写方法
原方法: