-- ---------------------- 本章概况
-- ---------------------- 课件
-- ---------------------- 随堂复习与企业真题
-- ---------------------- 拓展练习
-- ---------------------- 本章概况
-- ---------------------- 课件
- 关键字:this(1.1 this是什么?/1.2 什么时候使用this[1.2.1 实例方法或构造器中使用当前对象的成员/1.2.2 同一个类中构造器互相调用])
不能出现递归调用。如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)"
this()和this(实参列表)只能声明在构造器首行。
- 面向对象特征二:继承(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只支持单继承,不支持多重继承**
- 方法的重写(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(实参列表):调用父类的构造器协助当前对象的实例化,只能在构造器首行,只会找直接父类的对应构造器,找不到就报错
-
子类对象实例化全过程
面向对象特征三:多态性(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
- 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类(封装了对数组的增删改查操作)