深入理解java重载和重写
作者:维斯布鲁克.猩猩 发布时间:2022-09-28 12:19:32
重载
1.构造器的重载
因为构造器的名字必须与类名相同,所以同一个类的所有构造器名肯定相同,构成重载;为了让系统能区分不同的构造器,多个构造器的参数列表必须不同。
class Person{
int age;
String name;
public Person(){
}
public Person(int age){
this.age = age;
}
public Person(int age,String name){
this(age);
this.name = name;
}
}
2.方法的重载(overload)
1.定义:在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可。
两同一不同”:
同一个类、相同方法名
参数列表不同:参数个数不同,参数类型不同
2.举例:
Arrays类中重载的sort() / binarySearch()
3.判断是否重载:
跟方法的权限修饰符、返回值类型、形参变量名、方法体都没有关系!
class Person{
public void getSum(int i,int j){//A
System.out.println("憨憨");
}
public void getSum(double d1,double d2){//B
}
public void getSum(String s,int i){//形参先后顺序不同,也构成重载//C
}
public void getSum(int i,String s){//D
}
public void getSum(int i,int j){//与方法体无关!!!!
return 0;
}
public void getSum(int m,int n){//与参数名无关!!!!
}
private void getSum(int i,int j){//与权限修饰符大小无关!!!!
}
}
4.在通过对象调用方法时,如何确定某一个指定的方法 :
方法名------>参数列表
重写
为什么要重写:父类的功能无法满足子类的需求
方法重写的前提:必须要存在继承的关系!
应用:重写以后,当创建子类对象以后,通过子类对象调用子父类的同名参数的方法时,实际执行的时子类重写父类的方法
重写的规定:方法的声明:权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型
//方法体
}
约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法
A. 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
B. 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
>特殊情况:子类不能重写父类中声明为private权限的方法
C. 返回值类型:
>父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
>父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A的子类
//这样算重写,String是Object的子类
pulbic Object show(){//父类方法
}
public String show(){//子类方法
}
//这样不是重写,返回值类型不同
pulbic void catch(){//父类方法
}
pulbic int catch(){//子类方法
}
>父类被重写的方法的返回值类型是基本数据类型(比如:double).则子类重写的方法的返回值类型必须是相同的(double)
D.子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型.(可以抛出异常类型更少、异常类型更小、不抛出异常)
子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。
注意:A 父类的静态方法不能被子类覆盖为非静态方法。 B 父类的静态方法不能被子类覆盖为静态方法。(这两点与上面的那句话表达的是一个意思)
E.静态方法不能被重写
原因:重写依赖于类的实例,而静态方法和类实例并没有什么关系。而且静态方法和类实例并没有什么关系。而且静态方法在编译时就已经确定,而方法重写是在运行时确定的(动态绑定)。(也可以说java多态体现在运行时、而static在编译时、与之相悖)
《JAVA编程思想》中多次的提到:方法是静态的、他的行为就不具有多态性。静态方法是与类、而非单个对象相关联的。
区分方法的重载和重写
重载:不表现为多态性。
重写:表现为多态性。
从编译和运行的角度来看:
重载,是指允许存在多个同名方法,而这些方法的参数不同。编译器根据方法不同的参数列表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。他们的调用地址在编译期间就绑定了。Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。
所以:对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;
而对于多态,只有等到方法调用的那一刻,解释运行器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”;
引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚绑定,它就不是多态。”
重写规则补充
1.父类的抽象方法可以被子类通过两种途径重写(即实现和重写)。
2.父类的非抽象方法可以被重写为抽象方法(此时:子类必须为抽象类)。
来源:https://blog.csdn.net/weixin_49329785/article/details/119056683


猜你喜欢
- 以前就遇到过这个问题,今天重新拾起来。跑马灯效果其实就是当文字超过TextView控件宽度的时候,使用滚动的方式显示出来:方法1:(直接xm
- 微信公众号开发一般是针对企业和组织的,个人一般只能申请订阅号,并且调用的接口有限,下面我们就来简单的描述下接入公众号的步骤:1、首先你需要一
- 原始Spring开发Person.java准备Person.java类:package com.jektong.spring;public
- 一、NIO基本简介NIO (New lO)也有人称之为java non-blocking lO是从Java 1.4版本开始引入的一个新的IO
- 在之前的章节中,我们都是假设程序中只有一条执行流,程序从main方法的第一条语句逐条执行直到结束。从本节开始,我们讨论并发,在程序中创建线程
- Apache Shiro官网:https://shiro.apache.org/spring-boot.html.一、依据官网快速搭建Qui
- resultMap的Colum和property属性1: resultMap标签当我们的数据库字段与实体类的属性不一致时,就需要使用该标签进
- Excelapache 为 java开发者们提供了一套excel表格读写的工具:POI ,对于一个小白来说每次读写使用POI需要写一套复杂的
- java项目中常用maven工具来进行工程管理,但经常遇到的一个问题是生成的jar包越来越大,编译一次工程越来越慢。怎么有效地去除冗余依赖,
- 本文实例讲述了C#实现异步GET的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Coll
- 缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率
- 前言这是几个月前写的博文,睡前看了觉得有些敷衍,还是改了再发吧。之前的博客做了个锁屏应用,在以前各种酷炫的锁屏效果是很流行的,有时候会去锁屏
- 本文实例为大家分享了java计算工作时间的具体代码,不包括节假日、双休日,供大家参考,具体内容如下package common.util;
- 什么是JMMJMM全称Java Memory Model, 中文翻译Java内存模型,一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问
- 这篇文章主要介绍了SpringMVC的执行流程及组件详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 在C#中 “\”是特殊字符,要表示它的话需要使用“\\”。由于这种写法不方便,C#语言提供了@对其简化。只要在字符串前加上@即可直接使用“\
- maven报错:Failed to execute goal on project项目结构在hzz-entity项目上运行Maven ins
- 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Ap
- 微信公众平台(map.weixin.qq.com)/开放平台(open.weixin.qq.com)/商户平台(pay.weixin.qq.
- 今天给大家介绍一下Java实现钢琴的小程序,程序虽小,功能挺多,支持循环播放,录音等功能,首先简单介绍下源码结构:先看看钢琴界面实现,添加相