第七章 继承( 重写) 多态等
继承
基本概念
只支持单继承,既一个子类只能有一个直接父类
继承通过extend关键字实现
可以继承public和protect修饰的属性和方法,不论子类和父类是否在同一个包里
可以继承默认访问修饰符的属性和方法,但是子类和父类必须在同一个包里
无法继承父类的构造方法
使用继承可以省去许多重复代码
应用
语法格式:
设:父类类名为A,子类类名为B
则子类继承格式为:
访问修饰符 class B extend A{
}
super关键字
1.概述
super关键字是用在方法里的。
super关键字的作用是在子类中访问父类中被屏蔽的内容。
super关键字不仅可以访问父类的构造方法,还可以访问父类的成员,包括父类的属性、一般方法等。
还有就是访问权限的限制,如无法通过super访问父类的private成员
2.语法
访问父类构造方法:
super(参数)
访问父类属性/方法:
super.父类属性/方法
super和this关键字区别
this调用本类
super调用父类
构造方法使用this或super必须放在第一行 重点:必须二选一 两个不能同时放在第一行
四.实例化子类对象
在子类实例化时,会首先执行其父类构造方法,然后才执行子类的构造方法。
子类继承父类时构造方法调用规则:
1)子类构造方法中没有通过super调用父类有参构造,默认执行父类无参构造
2)子类构造方法中通过super调用了父类有参构造,那么将执行父类相应构造方法
方法重写
为什么要方法重写:
如果从父类继承的方法不能满足子类的需求,可以在子类中对父类的同名方法进行重写,以符合需求。
方法重写的概念
方法的重写或方法的覆盖(overriding)
子类根据需求对从父类继承的方法进行重新编写
重写时,可以用super.方法的方式来保留父类的方法
构造方法不能被重写
重写的规则
方法重写必须满足的要求:
重写方法和被重写方法必须具有相同的方法名。
重写方法和被重写方法必须具有相同的参数列表。
重写方法的返回值类型必须和被重写方法的返回值类型相同。
重写方法不能缩小被重写方法的访问权限。
如何进行方法重写
package com.atbdqn.six.three;
/**
- 父类
-
- 宠物类
-
- @author Administator
-
- */
- public class Pet {
- String name = “无名氏”;
- int health = 10;
- int love = 100;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getHealth() {
- return health;
- }
- public void setHealth(int health) {
- this.health = health;
- }
- public int getLove() {
- return love;
- }
- public void setLove(int love) {
- this.love = love;
- }
- public String getColor() {
- return color;
- }
- //构造方法
- public Pet() {
- }
- public Pet(String name) {
- this.name=name;
- }
- public Pet(String name,int health,int love) {
- this.name=name;
- this.health=health;
- this.love=love;
- }
- /**
-
- 显示信息
- */
- public void show() {
- System.out.println(“宠物的自白:\n我的名字是:” + name + “,健康值是:” + health + “,与主人的亲密度是:” + love);
- }
- }
- package com.atbdqn.six.three;
- /**
-
- 狗狗类
-
-
- @author Administator
-
- */
- public class Dog extends Pet {
- private String strain = “金毛”;
- public Dog() {
- }
- public Dog(String name, int health, int love, String strain) {
- super(name, health, love);
- this.strain = strain;
- }
- public String getStrain() {
- return strain;
- }
- public void setStrain(String strain) {
- // super.show();可以调用父类的方法
- // super.color;私有的属性不可调用
- this.strain = strain;
- }
- /**
-
- 输出狗的信息 重写父类的输出信息方法
- */
- public void show() {
- System.out.println(“宠物的自白:\n我的名字是:” + name + “,健康值是:” + health + “,与主人的亲密度是:” + love + “,我是一只聪明的:” + strain);
- }
- }
- package com.atbdqn.six.three;
- /**
-
- 企鹅类
-
-
- @author Administator
-
- */
- public class Penguin extends Pet {
- private String sex = “Q妹”;
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- public void print() {
- // super.health=0;public、protected可以继承过来
- // super.color;私有的继承不过来
- // super.love父子类不在同一包中,使用了默认访问修饰符的
- }
- /**
-
- 输出企鹅的信息 重写父类的输出信息方法
- */
- public void show() {
- System.out.println(“宠物的自白:\n我的名字是:” + name + “,健康值是:” + health + “,与主人的亲密度是:” + love);
- }
- }
方法重写和方法重载区别
重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型无关。
重写涉及的是子类和父类之间的同名方法,要求方法名相同、参数列表相同、返回值类型相同。
方法重载和方法重写的区别和联系:
重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型无关。
重写涉及的是子类和父类之间的同名方法,要求方法名相同、参数列表相同、返回值类型相同。
方法重VS方法重载
重点:访问修饰符不能比父类个严格 如 private<默认<protected<public
假如父类是protected那么子类是protected或者是public 适中子类中都要比父类大
Object类
Object类是所有类的父类。是所有java类的祖先。
在定义一个类时,没有使用extend关键字时,也就是没有显示的继承某个类,那么这个类直接继承Object类。
Object中定义了大量可以被其他类继承的方法,如 toString()、equals()。
一情况使用equals方法和toString()方法 重写比较多些
方法 说明
toString() 返回当前对象本身的有关信息,按字符串对象返回
equals() 比较两个对象是否是同一个对象,是则返回true
hashCode() 返回该对象的哈希代码值
getClass() 获取当前对象所属的类信息,返回Class对象
重写equals方法和toString()方法
多态
多态的三要素
要有继承
要有重写
父类引用指向子类对象
实现多态
多态概述
多态的含义:一个特定类型的变量可以引用不同类型的对象,并且能自动的调用引用类型的方法。
多态的优点:① 消除类型之间的耦合关系 ②可替换性 ③可扩充性 ④接口性 ⑤灵活性 ⑥简化性
多态存在的三个必要条件:①继承 ②重写 ③父类引用指向子类对象
向上转型
定义:子类向父类的转换称为方法转型。
语法:
父类型 引用变量名 = new 子类型();
案例
将一个父类的引用指向一个子类对象称为向上转型,系统会自动进行类型转换。
此时通过父类引用变量调用的方法是子类覆盖或继承了父类的方法,不是父类的方法。
此时通过父类引用变量无法调用子类特有的方法。
向下转型
语法:
子类型 引用变量名 = (子类型)父类型的引用变量
案例
当向上转型发生后,无法调用子类特有的方法。但如果需要调用子类特有的方法,可以通过把父类转换成子类来实现。
将一个指向子类对象的父类引用赋给一个子类的引用,即将父类类型转换为子类类型,称为向下转型,此时必须进行强制类型转换。
instanceof 运算符
在向下转型的过程中,如果不是真实子类类型,会出现类型转换异常。
在Java中提供了 instanceof 运算符来进行类型的判断。
使用 instanceof 时,对象的类型必须和 instanceof 后面的参数所指定的类有继承关系,否则会出现编译错误。
案例
重点:instanceof 运算符做完判断然后在使用向下转型 一般instanceof 和向下转型一起使用
多态应用
使用父类作为方法的形象
使用父类作为方法的形参,是java中实现和使用多态的主要方式。
案例
使用父类作为方法的返回值
使用父类作为方法的返回值,也是java中实现和使用多态的主要方式。
案例