第七章 继承( 重写) 多态等

继承
基本概念
只支持单继承,既一个子类只能有一个直接父类
继承通过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中实现和使用多态的主要方式。

案例
第七章 继承( 重写) 多态等