方法重写与方法重载的区别
一、方法覆盖()
在Java程序中,类的继承关系可以生成子类,子类继承父类,具有父类的所有特性,继承父类的所有方法和变量。
子类可以定义新功能。当子类需要修改父类的一些方法来扩展和增加功能时,程序员经常把这种操作方法称为重写,也称为重写。这称为覆盖或覆盖。
重写体现了Java的优越性。重写基于继承关系,丰富了语言结构。在Java的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖被继承的父类的方法。
在Java中重写继承的父类的方法是通过重写方法来实现的。所谓方法覆盖,是指子类中的方法与超类中被继承的方法具有完全相同的返回值类型、方法名、参数个数和参数类型。
这样,你可以重写父类的方法。如果子类重写了父类中的方法,被重写的方法必须在调用的时候调用,那么如果现在必须调用父类中的方法呢?
这个这个功能可以通过使用超级键来实现。超级键可以从子类访问父类的内容。如果要访问被覆盖的方法,使用“super. name(参数列表)”的形式调用。
如果要使用 super 关键字,在方法被覆盖后就不必使用了。您还可以显式指示方法是从父类继承的。使用 super 只会更明确地表明,如果您想从父类查找,则不要查找子类。
二、重写规则
重写方法时,需要遵循以下规则:
(一)父类方法的参数列表必须与子类重写的方法的参数列表完全相同,否则不能称为重写而是重载。
(二) 超类的返回类型必须和子类的返回类型相同 类覆盖的方法返回类型相同,否则不能称为覆盖而是重载.. ..
(三) Java规定子类重写的方法不能有更多的Class方法具有更严格的访问权限。写过Java程序的人都知道,父类中的方法在任何情况下都不能被重写。当修改父类中方法的访问权限字符为 时,该方法只能被自己的类访问,
不能被外部类访问,也不能在子类中被覆盖。如果定义父类的方法是在子类中定义的,所以程序运行时会报错。
(四)因为父类的访问修饰符的限制必须大于被子类覆盖的方法的访问修饰符,并且权限最小。
所以如果一个方法在父类中的访问权限是,那么它在子类中是不能被重写的。如果重新定义,只会定义一个新的方法,不会达到覆盖的效果。
(五)如果父类中的方法在继承过程中抛出异常,那么当父类的方法在子类中被覆盖时,也会抛出异常。异常,
并且抛出的异常不能超过父类中抛出的异常(可以等于父类中抛出的异常)。也就是说,被覆盖的方法一定不能抛出新的检查异常,
或比被覆盖方法的声明更广泛的检查异常。比如父类中声明了 的方法在被覆盖的时候是不能抛出的,
只能抛出的子类异常,可以抛出未经检查的异常。同理,如果在子类中创建了成员变量,
并且该变量与父类之一的变量名相同,称为变量覆盖或属性覆盖。但是这个概念很少被研究,因为它没有意义。
三、方法重载()
方法重载是一种让类统一处理不同类型数据的方法。调用方法时,传递给它们的参数的具体数量和类型决定了使用哪个方法,也就是多态。
所谓方法重载是指在一个类中,多个方法具有相同的方法名但参数列表不同。不同的参数列表是指参数个数、参数类型或参数顺序不同。
方法重载在实际应用中经常使用。不仅通用方法可以重载,构造函数也可以重载。
方法重载时,方法之间需要有一定的联系,因为这样可以提高程序的可读性,一般只有功能相似的方法才会被重载。
重载是指我们可以定义一些同名的方法,通过定义不同的参数来区分这些方法,然后在调用的时候,Java虚拟机会根据不同的参数列表选择合适的方法执行
。也就是说,当调用重载方法时,Java 使用参数的类型或数量来确定实际调用的是哪个重载方法。因此,每个重载方法的参数类型或数量必须不同。
虽然每个重载的方法可以有不同的返回类型方法,但返回类型不足以区分使用的是哪种方法。
Java 调用重载方法时,会执行参数与调用参数匹配的方法。使用重载时要注意以下几点:
1.使用重载时,只能传递不同的参数列表,而且必须有不同的参数列表。
2.不能被访问权限、返回类型或抛出的异常重载。
3.异常类型和方法个数不影响重载。
4.可以有不同的返回类型,只要参数列表不同。
5.可以有不同的访问修饰符。
6.可以抛出不同的异常。
四、方法覆盖和方法重载的区别
方法覆盖(方法覆盖)
概念:子类继承父类方法,我想在原来的基础上做一些修改。
格式特点:
1.方法名和参数列表必须完全一致
2.返回类型可以相同也可以不同,区别必须是原返回类型的子类型(可以隐式转换)。 JAVA最新版本的新特性方法,子类的返回值类型必须和父类的返回值类型一致。
2.子类抛出的异常不能超过父类对应方法抛出的异常(子类的异常不能大于父类的异常)
3.子类方法的访问级别不能低于父类对应方法的访问级别(子类的访问级别不能低于父类的访问级别)
4.**静态只能覆盖静态。但这通常不会发生。
方法重载
概念:在同一个类中,允许有多个同名函数,只要它们的参数号或参数类型不同。
格式特点:
1.方法名相同。
2.方法的参数表必须不同
如果参数个数不同,则参数类型无关紧要!
如果参数个数相同,则参数类型必须不同。
3.方法的返回类型和修饰符可以相同也可以不同。