Java重写(Override)与重载(Overload)
重写(Override)
概述:
重写是子类对父类的允许访问的方法 的实现过程进行重新编写。 返回值和形参都不能改变 。即外壳不变,核心重写。
重写的好处:
方法重写的规则:
参数列表与被重写的方法的参数列表必须完全相同。 返回类型与被重写方法的返回类型可以不同,但是必须是父类返回值的派生类 。 访问权限不能比父类中被重写的方法的访问权限低,权限可以扩大但是不能缩小。
public > protected > default > private 声明final的方法不能被重写。 构造方法不能被重写。 抛出异常,范围,可以被缩小,但不能被扩大。
代码演示:
在面向对象的原则里,重写意味着可以重写任何现有的方法
package oop. demo06;
class Person {
public void study ( ) {
System. out. println ( "人可以学习" ) ;
}
}
class student extends Person {
public void study ( ) {
System. out. println ( "学生可以学习" ) ;
}
}
public class Application {
public static void main ( String[ ] args) {
Person person = new Person ( ) ;
person. study ( ) ;
student student = new student ( ) ;
student. study ( ) ;
}
}
输出:
人可以学习
学生可以学习
上面例子中,person对象属于Person类,student对象属于Student类,两个类中都存在study方法,所以能够正常运行 创建student对象时,向上转型试下
package oop. demo06;
class Person {
public void study ( ) {
System. out. println ( "人可以学习" ) ;
}
}
class student extends Person {
@Override
public void study ( ) {
System. out. println ( "学生可以学习" ) ;
}
public void brak ( ) {
System. out. println ( "学生可以brak" ) ;
}
}
public class Application {
public static void main ( String[ ] args) {
Person person = new Person ( ) ;
person. study ( ) ;
Person student = new student ( ) ;
student. study ( ) ;
student. brak ( ) ;
}
}
输出:
java: 找不到符号
符号: 方法 brak ( )
位置: 类型为oop. demo06. Person的变量 student
这里报错,是因为student的引用类型Person类中没有break()方法
重载(Overload)
概述:
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同 重载就是在一个类中,有相同的函数名称,但形参不同的函数
方法的重载的规则:
被重载的方法必须改变参数列表(参数个数或类型不一样)。 被重载的方法可以改变返回类型。 被重载的方法可以改变访问修饰符。 被重载的方法可以声明新的或更广的检查异常。 无法以返回值类型作为重载函数的区分标准。
实现理论:
方法名称相同时,编译器会根据调用方法的参数个数,参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
代码演示:
public class Demo02 {
public static void main ( String[ ] args) {
Hello hello = new Hello ( ) ;
hello. hello ( ) ;
hello. hello ( "codepigpig" ) ;
hello. hello ( "codepigpig" , 22 ) ;
}
}
class Hello {
public void hello ( ) {
System. out. println ( "Hello,world" ) ;
}
public void hello ( String name) {
System. out. println ( "Hello," + name) ;
}
public void hello ( String name, int age) {
if ( age> 18 ) {
System. out. println ( "Hi," + name+ ",你已经成年了" ) ;
} else {
System. out. println ( "Hi," + name+ ",你是未成年" ) ;
}
}
}
输出:
Hello, world
Hello, codepigpig
Hi, codepigpig, 你已经成年了
重写与重载之间的区别:
区别点 重载方法 重写方法 参数列表 必须修改 一定不能修改 返回类型 可以修改 一定不能修改 异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常 访问 可以修改 一定不能做更严格的限制(可以降低限制)
总结:
方法的重写和重载都是java多态性的不同表现。 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。