2023-11-21第07章_面向对象编程(中)

-- ---------------------- 本章概况
-- ---------------------- 课件
-- ---------------------- 随堂复习与企业真题
-- ---------------------- 拓展练习

-- ---------------------- 本章概况


image.png

image.png

-- ---------------------- 课件

  1. 关键字:this(1.1 this是什么?/1.2 什么时候使用this[1.2.1 实例方法或构造器中使用当前对象的成员/1.2.2 同一个类中构造器互相调用])
不能出现递归调用。如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)"
this()和this(实参列表)只能声明在构造器首行。
  1. 面向对象特征二:继承(2.1 继承的概述/2.2 继承的语法/2.3 代码举例/2.4 继承性的细节说明/2.5 练习)
[修饰符] class 类A {
    ...
}

[修饰符] class 类B extends 类A {
    ...
}
类B,称为子类、派生类(derived class)、SubClass
类A,称为父类、超类、基类(base class)、SuperClass
**1、子类会继承父类所有的实例变量和实例方法**
**2、子类不能直接访问父类中私有的(private)的成员变量和方法**
**3、在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”**
**4、Java支持多层继承(继承体系)**
**5、一个父类可以同时拥有多个子类**
**6、Java只支持单继承,不支持多重继承**
  1. 方法的重写(override/overwrite)(3.1 方法重写举例/3.2 方法重写的要求/3.3 小结:方法的重载与重写/3.4 练习)
1. 子类重写的方法`必须`和父类被重写的方法具有相同的`方法名称`、`参数列表`。
2. 子类重写的方法的返回值类型`不能大于`父类被重写的方法的返回值类型。(例如:Student < Person)。
> 注意:如果返回值类型是基本数据类型和void,那么必须是相同
3. 子类重写的方法使用的访问权限`不能小于`父类被重写的方法的访问权限。(public > protected > 缺省 > private)
> 注意:① 父类私有方法不能重写   ② 跨包的父类缺省的方法也不能重写
4. 子类方法抛出的异常不能大于父类被重写方法的异常

此外,子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
方法的重载:方法名相同,形参列表不同。不看返回值类型。

4. 再谈封装性中的4种权限修饰
![image.png](https://upload-images.jianshu.io/upload_images/2673147-3c588dddbe6b996b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

5. 关键字:super(5.1 super的理解/5.2 super的使用场景/5.3 小结:this与super/5.4 练习)
* **方法前面没有super.和this.**
  * 先从子类找匹配方法,如果没有,再从直接父类找,再没有,继续往上追溯
* **方法前面有this.**
  * 先从子类找匹配方法,如果没有,再从直接父类找,再没有,继续往上追溯
* **方法前面有super.**
  * 从当前子类的直接父类找,如果没有,继续往上追溯
* **变量前面没有super.和this.**
  * 在构造器、代码块、方法中如果出现使用某个变量,先查看是否是当前块声明的`局部变量`,
  * 如果不是局部变量,先从当前执行代码的`本类去找成员变量`
  * 如果从当前执行代码的本类中没有找到,会往上找`父类声明的成员变量`(权限修饰符允许在子类中访问的)
* **变量前面有this.** 
  * 通过this找成员变量时,先从当前执行代码的==本类去找成员变量==
  * 如果从当前执行代码的本类中没有找到,会往上找==父类声明的成员变量(==权限修饰符允许在子类中访问的)
* **变量前面super.** 
  * 通过super找成员变量,直接从当前执行代码的直接父类去找成员变量(权限修饰符允许在子类中访问的)
  * 如果直接父类没有,就去父类的父类中找(权限修饰符允许在子类中访问的)
**1、this和super的意义**

this:当前对象

- 在构造器和非静态代码块中,表示正在new的对象
- 在实例方法中,表示调用当前方法的对象

super:引用父类声明的成员

**2、this和super的使用格式**

- this
  - this.成员变量:表示当前对象的某个成员变量,而不是局部变量
  - this.成员方法:表示当前对象的某个成员方法,完全可以省略this.
  - this()或this(实参列表):调用另一个构造器协助当前对象的实例化,只能在构造器首行,只会找本类的构造器,找不到就报错
- super
  - super.成员变量:表示当前对象的某个成员变量,该成员变量在父类中声明的
  - super.成员方法:表示当前对象的某个成员方法,该成员方法在父类中声明的
  - super()或super(实参列表):调用父类的构造器协助当前对象的实例化,只能在构造器首行,只会找直接父类的对应构造器,找不到就报错
  1. 子类对象实例化全过程


    image.png
  2. 面向对象特征三:多态性(7.1 多态的形式和体现/7.2 为什么需要多态性(polymorphism)?/7.3 多态的好处和弊端/7.4 虚方法调用(Virtual Method Invocation)/7.5 成员变量没有多态性/7.6 向上转型与向下转型/7.6.3 instanceof关键字/7.7 练习)

虚方法调用
子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。

向上转型与向下转型 
 //向上转型Pet pet = new Dog();
 //向下转型Dog d = (Dog) pet; 强转

//检验对象a是否是数据类型A的对象,返回值为boolean型
对象a instanceof 数据类型A 
  1. Object 类的使用(8.1 如何理解根父类/8.2 Object类的方法)
    1、(重点)equals()
- == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址

- equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。

- 具体要看自定义类里有没有重写Object的equals方法来判断。

- 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。

2、(重点)toString()

① 默认情况下,toString()返回的是“对象的运行时类型 @ 对象的hashCode值的十六进制形式"
② 在进行String与其它类型数据的连接操作时,自动调用toString()方法

3、clone()

    @Override
    protected Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }

4、finalize()

- 子类可以重写该方法,目的是在对象被清理之前执行必要的清理操作。比如,在方法内断开相关连接资源。
  - 如果重写该方法,让一个新的引用变量重新引用该对象,则会重新激活对象。
- 在JDK 9中此方法已经被`标记为过时`的。

5、getClass()
public final Class<?> getClass():获取对象的运行时类型

6、hashCode()
public int hashCode():返回每个对象的hash值。(后续在集合框架章节重点讲解)

8.3 native关键字的理解
需要看了再重新补

-- ---------------------- 随堂复习与企业真题

一、随堂复习

1. this关键字的使用

  • this调用的结构:属性、方法;构造器

  • this调用属性或方法时,理解为:当前对象或当前正在创建的对象。

    public void setName(String name){ //当属性名和形参名同名时,必须使用this来区分
      this.name = name;
    }
    
    public Person(String name){
        this.name = name;
    }
    
  • this(形参列表)的方式,表示调用当前类中其他的重载的构造器。

2. 面向对象的特征二:继承性

  • 继承性的好处
    • 减少了代码的冗余,提高了复用性;
    • 提高了扩展性
    • 为多态的使用,提供了前提。
  • Java中继承性的特点
    • 局限性:类的单继承性。后续我们通过类实现接口的方式,解决单继承的局限性。
    • 支持多层继承,一个父类可以声明多个子类。
  • 基础:class A extends B{}
  • 理解:子类就获取了父类中声明的全部的属性、方法。可能受封装性的影响,不能直接调用。

3. 方法的重写(override / overwrite)

  • 面试题:方法的重载与重写的区别?
    • 方法的重载:“两同一不同”
    • 方法的重写:
      • 前提:类的继承关系
      • 子类对父类中同名同参数方法的覆盖、覆写。

4. super关键字的使用

  • super可以调用的结构:属性、方法;构造器
  • super:父类的
  • super调用父类的属性、方法:
    • 如果子父类中出现了同名的属性,此时使用super.的方式,表明调用的是父类中声明的属性。
    • 子类重写了父类的方法。如果子类的任何一个方法中需要调用父类被重写的方法时,需要使用super.
  • super调用构造器:
    • 在子类的构造器中,首行要么使用了"this(形参列表)",要么使用了"super(形参列表)"。

5. (熟悉)子类对象实例化的全过程

  • 结果上来说:体现为继承性
  • 过程上来说:子类调用构造器创建对象时,一定会直接或间接的调用其父类的构造器,以及父类的父类的构造器,...,直到调用到Object()的构造器。

6. 面向对象的特征三:多态性

  • 广义上的理解:子类对象的多态性、方法的重写;方法的重载

    狭义上的理解:子类对象的多态性。

  • 格式:Object obj = new String("hello"); 父类的引用指向子类的对象。

  • 多态的好处:减少了大量的重载的方法的定义;开闭原则

    • 举例:public boolean equals(Object obj)
    • 多态,无处不在!讲了抽象类、接口以后,会有更好的理解。
  • 多态的使用:虚拟方法调用。“编译看左边,运行看右边”。属性,不存在多态性。

  • 多态的逆过程:向下转型,使用强转符()。

    • 为了避免出现强转时的ClassCastException,建议()之前使用instanceOf进行判断。

7. Object类的使用

  • 根父类
  • equals()的使用
    • 重写和不重写的区别
    • 面试题: == 和 equals()
  • toString()的使用
    • Object中toString()调用后,返回当前对象所属的类和地址值。
    • 开发中常常重写toString(),用于返回当前对象的属性信息。

8. 项目二:拼电商客户管理系统

  • 编写两个类:Customer 、 CustomerList类(封装了对数组的增删改查操作)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容