争气儿子继承爸爸财产后再创价值的故事--方法重写与多态

前言:前面我们提到继承,儿子继承了爸爸的财产,那继承后呢,总不能坐吃山空,总得挖粪涂墙创造点价值吧,这就要讲到方法重写和多态了,基于爸爸的财产,儿子再创价值的故事。

一、方法重写

为什么要方法重写?当需要对父类方法进行增加或改变时使用,我们就需要方法重写了。

在继承的情况下,子类的方法满足以下条件:
1、方法名相同
2、参数列表相同
3、返回值类型相同或者是其子类
4、访问权限不能严于父类
5、父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
6、子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
7、父类的私有方法不能被子类覆盖
8、不能抛出比父类方法更多的异常

方法重写和方法重载的区别
在这里插入图片描述

重写时,用super.方法的方式保留父类的方法

super的作用
1、访问父类的方法,super.print(),不能调用private
2、访问父类的属性,super.name,不能调用private
3、访问父类构造方法,super(),super(name)

super关键字来访问父类的成员
1、使用super关键字,super代表父类对象
2、super只能出现在子类的方法和构造方法中
3、super调用构造方法时,只能是第一句
4、super不能访问父类的private

super使用场景
1、子类方法重写父类方法
2、在子类中定义了和父类同名的成员变量,可使用super调用父类被子类覆盖的同名成员 注:调用父类的父类,也用super.

继承下的构造方法:(告诉我调用谁,我就调用谁,没告诉我就调用父类无参构造方法)
1、子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法系统默认调用父类的无参构造方法
2、子类构造方法通过super显式调用父类的有参构造方法 执行父类相应构造方法,而不执行父类无参构造方法
3、子类构造方法通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则

二、多态

什么是多态:父类变量引用子类对象,
<父类型> <引用变量名>=new<子类型>() ;
向下转型<子类型><引用变量名>=(<子类型>)<父类型的引用变量>

向上(向下)转型
<父类型> <引用变量名>=new<子类型>() ;——>向上转型
此时通过父类引用变量调用的方法使子类覆盖或继承父类的方法,不是父类的方法此时通过父类引用变量无法调用子类特有的方法

如果需要调用子类特有的方法,怎么办?---->向下转型
<子类型><引用变量名>=(<子类型>)<父类型的引用变量>

向下转型,如果没有转化为真实的子类类型,此时运行时会报错,
如Pet a=new Dog(),正常向下转型就是,Dog p=(Dog) a,
如果不小心转换成了另一个子类型,如 Penguin p=(Penguin) a,此时编译时不会报错,运行时会报错ClassCastException,如何避免?—>运用instanceof进行类型的判断

instanceof的运用
写法:对象名 instanceof 类型 如a instanceof dog

向上转型和向下转型需要注意什么:
向上转型注意点:父类引用变量无法调用子类特有的方法,调用时会出现编译报错,这时候就要用向下转型来避免。
向下转型注意点:会容易转成另一个子类型,编译时不报错,运行才会报错,可以通过instanceof进行类型的判断再转型。

使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类在继承上有上下级关系。

猜你喜欢

转载自blog.csdn.net/weixin_48185778/article/details/107550529