Java中的重写是继承中的一个重难点,这里为了方便聊重写先简单回顾一下继承
继承
为了减少相似代码冗余的一种方法,子类可以继承父类的部分代码(除去特殊部分外的所有)
eg:
public class Father {
String name;
String mobile;
String address;
public void eat() {
System.out.println("正在吃饭。。。。");
}//父类
}
public class Son extends Father { //子类
public static void main(String[] args) {
Son son=new Son();
son.eat();
}
}
结果:正在吃饭。。。。
注:1. object是所有类的父类
2. 只能继承一个,且会继承父类的父类(可以有爷爷,但不能有两个爸爸)
3。若class前加上final则其不能有子类
3.private 引领的不能被子类继承
5.子类可以继承父类成员变量,子又声明了同样的成员变量时,用子(就近),不区分类型。
重写
当继承的代码在子类中使用不方便时就需要用到重写了,但重写有着诸多的注意事项:
接下来代码全以下面代码的重写:
public void eat(int a) {
System.out.println("正在吃饭。。。。");
}
1.子类重写后的访问权限大于等于父类public>protect>private
eg:
private void eat(int a) {
System.out.println("真在吃饭。。。。");
} //wrong
public void eat(int a) {
System.out.println("真在吃饭。。。。");
} //ture
-
父类中static修饰的方法,子类不允许重写,但是可以被继承;子类重写后的方法不能添加****static修饰,会报错
注意:父类子类中都加了static虽不会报错但它不是重写 -
重写后的方法,方法名必须和父类方法名相同,参数列表除名字不做限制外,其它必须相同,否则不会报错但不是重写
public void eat(int b) {
System.out.println("真在吃饭。。。。");
} //是重写
public void eat(double b) {
System.out.println("真在吃饭。。。。");
} //不报错,但不是重写
4. 返回值
a. 如果父类方法返回值为void或基本数据类型,则重写后的方法必须和父类方法保持一致(否则就算不报错也有可能是新的方法而不是重写)
public double eat(double b) {
System.out.println("真在吃饭。。。。");
} //不报错,但不是重写
b. 如果父类方法返回值为引用类型,则重写后的方法返回值要么与父类一致,要么是父类方法返回值的子类
eg:
Object eat(String name) { //父类
System.out.println("在吃饭。。。。");
return 0;
}
String eat(String name) { //子类
System.out.println("真在吃饭。。。。");
return "";
} //ture
- 最后,说明一下要验证是不是重写,只需在方法前面加上
@Override 看报不报错即可验证
注意
若重写后需调用父类方法需使用super.方法名(参数列表)