[TOC]
一. 面试题及剖析
1. 今日面试题
在上一篇文章中,壹哥 带各位详细的讲解了方法重载与重写的各自特点及区别,但是我们去面试的时候,面试官有时候并不会直接问我们”说说方法重载与重写的区别“,而是会间接的拐弯来问我们,比如:
Java中父类的构造方法能不能被重写?
2. 题目剖析
其实上面这个题目,考察的还是我们对方法重写的掌握情况,只要我们把上一篇文章的内容熟悉的记下来,这个问题就可以得出很明确的答案。
二. 参考答案
1. 方法重写特点
为了方便各位查阅,壹哥 再次把方法重写的特点总结一下。
- 方法重写发生在父类与子类之间,即父类的成员方法只能被它的子类重写;
- 方法重写时,方法名、参数列表必须与被重写方法完全相同;
- 返回值类型与被重写方法的返回值类型可以不同,但是必须是父类返回值的派生类(Java5 及更早版本要求返回值类型相同,Java7 及更高版本可以不同);
- 子类方法的访问修饰符一定要大于等于被重写方法的访问修饰符(public>protected>default>private);
- 重写的方法能够抛出任何非强制性异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明更广泛的强制性异常,反之则可以;
- 构造方法不能被重写;
- 声明为 final 的方法不能被重写,即如果不能继承一个方法,则不能重写这个方法;
- 声明为 static 的方法不能被重写,但是能够被再次声明;
- 子类和父类如果在同一个包中,那么子类可以重写父类中的所有方法,除了声明为 private 和 final 的方法;
- 子类和父类如果不在同一个包中,那么子类只能够重写父类中声明为 public 和 protected 的非 final 方法;
2. 面试题答案
在上面小节的第6条里面,壹哥 明确告诉了各位,构造方法不能被重新!所以本题目的答案就出来了,Java中父类的构造方法不能被重写!
但是有的小伙伴可能会质疑,难道 壹哥 你说的就对吗?对与不对,我们做个试验看看吧。
3. 代码案例
首先我们创建一个父类Father,并创建对应的一个构造方法。
//父类
public class Father {
public Father(){
System.out.println("father...");
}
public void writeCode() {
System.out.println("码爹: 做个开心的码农一世... 撸Java...");
}
}
然后再创建一个子类Son,类内部的方法定义如下:
public class Son extends Father {
public Father(){
System.out.println("father...son...");
}
public Son(){
System.out.println("son...");
}
@Override
public void writeCode() {
System.out.println("码崽: 做个开心的码农二世... 撸Java/AI...");
}
}
这时候我们截图看一下,会发现Son类内部的Father()方法直接在编译阶段就报错了。
所以Java中父类的构造方法是不能被重写的!这是因为构造方法不能被继承,子类中不能定义一个无void无返回值的方法,会出现编译错误。但是我们要注意,构造方法不能被重写但可以被重载,并且子类的构造器中可以通过super关键字调用父类的构造方法(默认自动调用无参构造)!
三. 结论
至此,壹哥 在本文中再次带大家复习了方法重写的知识点,希望大家牢牢记住。对于方法重写,你还有哪些疑问呢?请在评论区留言吧。



