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

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

案例
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值