1、为什么需要重写?
- 大部分时候,子类总是以父类为基础,额外增加新的成员和方法,但是当父类的某些方法与实际子类需要的方法有冲突或子类不需要时,需要重写父类的方法。
- 例如,鸵鸟属于鸟类,大部分鸟类会飞,而鸵鸟不会飞,此时需要重写鸵鸟"飞"这个方法。
代码如下:
// 鸵鸟类 --> 继承鸟类
public class Ostrich extends Bird {
public void test(){
System.out.println("鸵鸟类可以无法在天上飞..");
}
}
// 鸟类,即鸵鸟的父类
public class Bird {
public void test(){
System.out.println("鸟类可以在天上飞..");
}
}
2、如何重写父类方法?
static修饰的方法的调用只和左边的类型有关,静态方法不能进行重写,如下面代码…
// 鸵鸟类 --> 继承鸟类
public class Ostrich extends Bird {
public static void test(){
System.out.println("鸵鸟鸟类不可以在天上飞..");
}
}
// 鸟类 --> 鸵鸟类的父类
public class Bird {
public static void test(){
System.out.println("鸟类可以在天上飞..");
}
}
// 应用程序 --> main
public class Application {
public static void main(String[] args) {
// static修饰的方法的调用只和左边的类型有关:
// Ostrich(调用Ostrich的), Bird(调用Bird的)
Ostrich ostrich = new Ostrich();
// 父类的引用bird指向子类
Bird bird = new Ostrich();
ostrich.test();
bird.test();
}
}
代码执行后如下:
鸵鸟鸟类不可以在天上飞..
鸟类可以在天上飞..
非静态方法才能进行重写 – 代码如下…
// 鸵鸟类 --> 继承鸟类
public class Ostrich extends Bird {
@Override // 注解:有功能的注释
public void test(){
System.out.println("鸵鸟鸟类不可以在天上飞..");
}
}
// 鸟类 --> 鸵鸟类的父类
public class Bird {
public void test(){
System.out.println("鸟类可以在天上飞..");
}
}
// 应用程序 --> main
public class Application {
public static void main(String[] args) {
Ostrich ostrich = new Ostrich();
// 父类的引用bird指向子类
Bird bird = new Ostrich();
ostrich.test();
bird.test();
}
}
代码运行如下:
鸵鸟鸟类不可以在天上飞..
鸵鸟鸟类不可以在天上飞..
此时已成功重写父类的方法,即只要是Ostrich的对象调用的都是重写后的方法。
3、总结
重写:需要有继承关系,子类重写父类的方法
- 方法名必须相同,方法体不同
- 参数列表必须相同
- 修饰符:范围可以扩大但是不能缩小
- 抛出的异常:范围可以被缩小,但是不能扩大 --> ClassNotFoundException