1、重写(Override)
先来看一段重写的代码吧。
//父类老杨
class LaoYang{
public void write() {
System.out.println("老杨写了一本《活着》");
}
}
//子类小杨
class XiaoYang extends LaoYang {
@Override
public void write() {
System.out.println("小杨写了一本《继续活着》");
}
}
public class Person {
public static void main(String[] args) {
XiaoYang yang = new XiaoYang();
yang.write();
}
}
运行结果
在上面的代码中,声明了一个类型为 LaoYang 的变量 yang。在编译期间,编译器会检查 LaoYang 类是否包含了 write() 方法,发现 LaoYang 类有,于是编译通过。在运行期间,new 了一个 XiaoYang 对象,并将其赋值给 yang,此时 Java 虚拟机知道 yang 引用的是 XiaoYang 对象,所以调用的是子类 XiaoYang 中的 write() 方法而不是父类 LaoYang 中的 write() 方法,因此输出结果为“小杨写了一本《继续活着》”。
2、重载(Overload)
再来看一段重载代码吧
class YngHa{
public void read() {
System.out.println("老杨读了一本《活着》");
}
public void read(String book) {
System.out.println("老杨读了一本《" + book + "》");
}
}
public class Overload {
public static void main(String[] args) {
YngHa yng = new YngHa();
yng.read();
yng.read("金瓶梅");
}
}
运行结果
重载的两个方法名相同,但方法参数的个数不同,返回类型不同。另外也不涉及到继承,两个方法在同一个类中。就好像类 LaoWang 有两个方法,名字都是 read(),但一个有参数(书名),另外一个没有(只能读写死的一本书)。
3、总结:
重写:
-
方法名,参数列表(参数顺序、个数、类型),返回值类型都要相同;
-
子类方法不能缩小父类方法的访问权限(public>protected>default>private);
-
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常;
-
是一个类中多态性的一种表现,具体是运行时期的多态性。
-
发生在子类和父类之间;
-
方法被定义为final不能被重写。
重载:
-
方法名相同、参数列表必须不同(参数顺序、个数、类型)、返回值类型可以相同或不相同;
-
是一个类中多态性的一种表现;具体是编译时期的多态性;
-
可以有不同的访问修饰符;
-
可以抛出不同的异常;
-
存在于父类和子类、同类中。
完!