重载、重写、方法相同

首先一个方法对外暴露的信息有以下几个——

权限、是否静态、是否final、返回类型、方法签名、异常类型。

其中,按照Effective Java中的约定,方法签名包括了方法名和参数列表。

重写指的是父类中的方法无法满足子类的需求,子类通过重写一个方法的方式来覆盖父类的方法。

而重写方法的某个信息需要与被重写方法的那个信息一致,才能让编译器知道,方法重写发生了。

那个是信息就是方法签名,子类的方法会去重写(override)父类中与其方法签名一致的方法,

方法签名一致,指的是方法名一致且参数类型、个数、类型顺序都一致。

红框证明了重写确实发生了,绿框则表示方法的“是否final”不一致并不影响方法重写,

并且,参数的变量名(b和a)不一致也不影响方法重写,因为它们是提供给方法体内部使用的。

但是,尚不能证明 “权限、是否静态、返回类型、异常类型 需要与被重写的方法一致才能发生重写”  是错误的,

而实际上,方法重写确实对上述信息有所限制。

方法重写还需要遵守一定的限制,否则编译器会报错。

1、重写方法的权限只能比被重写方法的大,不能比它的小。

2、是否静态需要与被重写方法一致

3、重写方法可以是final,也可以不是final(被重写的方法不可能是final的,否则它无法被重写)

4、返回类型需要与被重写方法一致

5、异常类型的捕获精度只能比被重写方法的更精确(或是不抛异常),而不能比它的更宽泛

综合以上五点,并不是子类的方法与父类的方法相同时,重写才会发生,而是在方法签名相同时便发生了。重写发生了以后子类方法受到了父类方法的一些限制。

那么方法签名不同的方法之间有什么关系呢?

1、仅仅方法名不同、或是都不同。

  如果两个方法方法名都不同……那么他们毫无关系,

  就像Math.asin(double d)和Math.atan(double d)除了方法名不一样,其他的方法信息都一样,

  但是它们完全是两个方法。都不同的情况显然也是同理。

2、仅仅参数列表不同。

  这种情况下,被称为方法重载(overload)。

  如果有一个设计良好的方法,那么他的方法名应该能够自身作用,

  现在希望这个方法能够作用在别的参数组合上,而方法作用不变,

  那么最好的方式应该是再存在一个一样方法名的方法,但是拥有新的参数列表。

  就像String.valueOf(boolean b)、String.valueOf(int i)……那样。

时间: 2025-01-11 18:03:01

重载、重写、方法相同的相关文章

java 方法的重载重写

面向对象有三大特性:封装,继承,多态 多态则需要满足三大条件1要有继承2要有重写3父类引用子类对象 很多人对方法的重载重写有很大疑问,下面我来介绍一下方法的重载重写 方法重载就是方法名称重复,加载参数不同 满足的条件: 一.方法名一定要相同. 二.方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体. 1.如果参数个数不同,就不管它的参数类型了! 2.如果参数个数相同,那么参数的类型必须不同. 三.方法的返回类型.修饰符可以相同,也可不同. class MethodOverloadi

疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同时这这里我们需要注意以下两点:  A.方法重载与返回值类型没有任何关系;  B.方法重载与是否有static修饰没有任何关系. 那我们如何才能确定到底调用的哪个方法呢?  A.主调者:明确是谁在调用这个方法,是类还是对象  B.方法名和形参:确定调用哪个方法(由方法名和形参共同决定) 例1: 1 p

JAVA SE中方法重载和方法重写及数据库中子程序的重载

首先方法重写和方法重载是建立在Java的面向对象的继承和多态的特性基础上而出现的.至于面向对象的继承和多态的特性我就不在这里多说了.继承是指在一个父类的基础再创建一个子类,这样子类就拥有了父类的非私有的特性,同时子类还可以扩展自己的特性,这样就引出了方法重写和方法重载! 一.方法重写(Override)         在Java中如何来定义重写:Java程序中类的继承特性可以产生一个子类,子类继承父类就拥有了父类的非私有的属性(方法和变量),在子类中可以增加自己的属性(方法和变量),同时也可以

java面向对象中的方法重载与方法重写的区别

一.方法重载(overload) a:一个类中允许声明多个方法 b:一个类中允许有多个方法名称一样,但是参数不同的多个方法.通过参数不同来区别不同的方法. 参数不同表现为: 1:参数个数不同 2:参数类型不同 3:参数类型的顺序不同也是参数类型不同 4:在参数类型一样的情况下,名称不一样不代表参数不一样 重载方法的调用: 1:根据调用的时候实际参数来判断到底调用的是哪一方法 2:根据参数的要求,严格匹配传入的对应类型 3:如果严格匹配不到的话,默认遵循就近匹配 4:根据数据默认转换的顺序就近匹配

Java学习之方法重载和方法重写(覆盖)比较

方法重载和方法覆盖 请带着下面两点来看文章: 覆盖即重写,覆盖不等于重载,即重写不等于重载. 覆盖(重写)蕴含继承性,而重载只能在本类中使用,不含继承. 方法名和参数列表的比较 方法覆盖中的方法名和参数 首先创建基类Shape: public class Shape {   public void draw() { System.out.println("Shape.draw()"); } } 子类Circle: public class Circle extends Shape {

Java重载重写与实现方法的规则

这几天在实训过程中做到了一个题,这个题目问的是 非抽象类实现接口后,必须实现接口中的所有抽象方法,除了abstract外,方法头必须完全一致.这句话是错误的.然后在做错以后自己总结一下重载 重写 和实现的几个点. 重载:方法名一致即可,访问修饰符.返回值类型无关,然后不同的重载方法参数列表的参数的顺序,类型,数量进行变换即可. 重写:重写方法的访问修饰符可以不同,但访问权限需要比父类中的大,比如protected修饰的方法重写的时候可以重写为public类型.返回值类型可以是父类中方法返回值类型

java——阶段性整理(方法的重载重写和一些关键字)

一.方法的重载和方法的重写 重载:overload,同一给类中方法名相同,参数不同.作用:一种行为提供多种实现方式并提高可读性. 重写:override,子类继承父类的方法,内容不同.作用:父类方法无法满足子类的要求,子类通过方法重写满足要求 二.简述static关键字的作用. static可以修饰变量.方法.代码块和内部类,分别称为静态变量,静态方法,静态代码块和静态内部类. 1)静态遍历属于这个类所有,即由该类创建的所有对象共享同一个static变量. a)不管有多少个对象,静态变量只有一份

JAVA学习(七):方法重载与方法重写、thiskeyword和superkeyword

方法重载与方法重写.thiskeyword和superkeyword 1.方法重载 重载可以使具有同样名称但不同数目和类型參数的类传递给方法. 注: 一是重载方法的參数列表必须与被重载的方法不同,而且这样的不同必须足以清楚地确定要调用哪一个方法: 二是重载方法的返回值类型能够与被重载的方法同样,也能够不同,可是仅仅有返回值类型不同不能表示为重载. 比如,最经常使用的println()方法在JDK的java.io.PrintStream中定义了十几种形式的重载,经常使用格式例如以下: public

8.方法重载和方法重写比较

方法的重载 一个类中可以定义相同的名字,但参数类型和个数不同 一个类 方法的重写 ①具有相同方法名称,参数列表,参数个数,返回类型 ②重写方法不能使用比被重写方法更严格的访问权限 继承

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性.重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同.参数个数不同或者二者都不同)则视为重载:重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则).重载对返回类型没有特殊的要求.