Java 方法重写和多态

第四章-方法重写和多态

1、方法重写定义

当子类继承父类方法,但是父类的方法功能无法满足子类的需求,那就需要在子类重新定义父类的方法,加入子类需要的内容,这种就是方法重写

方法重写或方法的覆盖(overriding):
1)子类对所继承父类相同方法的一种更改,这个更改需要遵循格式按照父类的格式,访问权限,抛出异常等等,都在父类方法控制范围内,内部具体实现可以实现不同的效果。
2)重写时,可以用super.方法的方式来保留父类的方法
3)构造方法由于类名不同,所以不能被继承,也就不能被重写
4)方法重写的前提是:必须要存在继承的关系。
备注:
String字符串的equals方法就是最明显的重写,比较值是否相等,而不是底层object的==(比较是否为同一对象)
使用的注解:@override,存在继承关系,可以直接写要重写方法名,自动会带出重写的方法,注意,如果加了注解,代表必须是重写方法


2、方法重写的规则

1)方法重写时,方法名与形参列表必须一致。
2)方法重写时,子类的返回值类型相同或者是其子类,即必须要小于或者等于父类的返回值类型。
3)方法重写时,子类的权限修饰符不能严于父类,即要大于或者等于父类的权限修饰符。
4)方法重写时,父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
5)方法重写时,子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
6)方法重写时,父类的私有方法不能被子类覆盖
7)方法重写时,子类抛出的异常类型要小于或者等于父类抛出的异常类型。


3、方法重载和方法重写的异同

比较项    位置    方法名       参数列表     返回值            修饰符
重写      子类     相同         相同      相同或者子类   不能严于父类
重载      同类     相同         不同      无关                 无关

4、object类

所有类的父类,如果没有使用extends关键字指定基类,那默认是继承object类

object类经常被重写的方法
toString(); 返回当前对象本身的有关信息,按字符串对象返回
equals(); 比较两个对象是否是同一个对象,是则返回true

重点关注equals方法和toString方法的重写

Object的equals方法
比较的是两个对象是不是同一个对象,是则返回true
操作符 ==
对于简单数据类型,比较的是值是否相等,如果是引用内容,两者比较的是是否为同一个对象

由此看出
object的equals跟 == 的效果是一样的
当有特殊需求时候,如认为属性值相同即为同一个对象,那就要重写equals方法
平时使用过String类的equals方法,那这个就是重写过equals方法的

重写示例:

 @Override
        public boolean equals(Object obj) {
            if(obj == null){
                return false;
            } else {
                if(obj instanceof Cat){
                    Cat cat = (Cat)obj;
                    if(cat.color == this.color 
                            && cat.getHealth() == this.getHealth()){
                        return true;
                    }
                }
            }
            return false;
        }

5、多态

没使用多态的弊端:
频繁修改代码,代码的扩展性、可维护性差
同一个方法,可能需要针对不同的类型参数,重复定义

定义:
同一个行为,具有多个不同形式的表现或者能力

使用多态三个必要条件:
1. 继承–存在继承关系
2.重写–子类重写父类的方法(通过父类调用子类的同名方法)
3.父类引用对象指向子类的实例(对象)

向上转型
父类的引用指向子类的实例,类型自动转换
语法:
父类 对象名 = new 子类对象();

向下转型
将一个指向子类对象的父类,强转为子类对象
语法:
子类 对象名 = (子类)父类的引用变量

注意:
向下强转时,必须是转换为真实的子类类型,否则会出现转换异常
使用instanceof关键字,判断是否是该子类创建的实例

实现多态的两种形式:
1)父类作为方法形式参数
2)父类作为方法的返回值

父类指向子类对象时:
注意:
1)通过父类引用变量可以调用的方法是子类重写过父类的方法
2)通过父类引用变量可以调用的方法也可能是子类未重写父类的方法,调用的是从父类继承的旧方法
3)通过父类引用变量无法调用子类特有的方法(父类没有该方法,所以调用不到)
4)属性也类似

子类引用指向自身对象时:
注意:
1)子类引用变量调用的方法是子类覆盖的方法
2)子类引用变量调用的方法如果是未覆盖父类的,实际调用的是从父类继承的旧方法
3)子类引用变量可以调用子类特有的方法
4)属性也类似

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值