如果只看字面上的区别,很容易将这两者混淆。下面是对重写和重载进行区别理解。
一:重写(override)(覆盖)
官方定义:重写是子类对父类允许访问的方法的实现过程进行重新的编写,他的返回值和方法名,参数都不变。
用一句话解释就是:外壳不变,内在核心大变!
重写的注意事项:
1:重写只是存在于子类重写父类中,即必须要有继承关系存在。
2:重写的方法,他的返回值,方法名,形参必须全都一样,即外壳必须要和父类的被重写的方法一样。
3:声明为final的方法能被继承过来,但是不能被修改,final就代表了最终的意思。
4:被static修饰的方法,可以被继承但是不能被重写,因为被static修饰的方法或者变量他就是这个类的方法或者变量,他不再属于对象的方法或者变量。如果在子类中写了一个和父类一模一样的static方法,那么该static方法是这个子类独有的方法,记住,static就是代表被修饰的成员已经上升为类的成员。
5:如果子类和父类在同一个包里面,那么除了被private和final修饰的方法以外都可以被重写。(因为访问修饰符private限定只能在本类进行直接使用==详见四种访问修饰符区别)
6:如果子类和父类不在同一个包里面,那么将会只能去重写父类中被public,protected,的非final的方法,注意,这个final不是访问修饰符(详见四中访问修饰符)。
7:这些能被重写的前提是能被继承,所以,如果不能被继承,那么也就谈不上被重写。
8:子类重写的方法中如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
//父类
public class Person {
public void run(){
System.out.println("人在跑");
}
public final void eat(){//被final修饰的父类方法。
System.out.println("人吃饭");
}
}
//子类
public class Student extends Person {
public void run(){
System.out.println("学生在跑");
}
public final void eat(){
//在子类中写这个方法的时候,会报错
//报错:Cannot override the final method from Person,不能重写父类中被父类修饰的方法。
System.out.println("学生吃饭");
}
}
//测试类
public class TestStudent {
public static void main(String[] args) {
Student stu = new Student();
stu.run();//方法调用输出的是“学生在跑”,执行的是重写的方法。
stu.eat();//方法输出的是人吃饭,说明虽然不能重写,但是可以继承得到方法。
}
}
分析:重写是在子类中将父类中的的可被访问(前提是可继承,可访问)的方法的外壳拿过来,但是内部的核心被新编写了。
二:重载(overload)
官方定义:在一个类里面,方法名相同,但是参数列表不同,而且返回值也能不同的方法,称为方法的重载。
这里重点是:
1:每一个重载的方法都必须有一个独一无二的参数列表。
2:重载是发生在一个类里面的,区别重写(发生在父子类中)。
3:重载的方法可以改变访问修饰符。
4:重载类型的返回值类型可以修改,但是重写的返回值类型是不能改变的。
public class Person {
public String name;
public void run(){
System.out.println("人在跑");
}
public void run(String name){
System.out.println(name+"在跑");
}
}
//测试类
public class TestStudent {
public static void main(String[] args) {
Student stu = new Student();
stu.name = "张三";
stu.run();//输出人在跑
stu.run("李四");//输出李四在跑。
}
}
分析:上述代码展示了重载,参数列表不一样。可以让一个类去统一处理类型的数据。这也体现了多态性。