一、重写(Override)
重写是子类对父类的允许访问的方法的实现过程进行重新编写。
在Java中,默认情况下方法都是可重写的,即没有特殊的关键字来声明一个方法可以重写。如果在Java程序中无法覆盖某个方法,则必须在其前面加上前缀使用关键字final。
子类只能添加新方法,无法重写超类中的方法,子类只能向超类添加新方法,而不能覆盖它们。
重写的函数有相同的名称、参数或签名以及相同的返回类型,所执行方法的版本将由用于调用它的对象确定:如果使用父类的对象调用该方法,则将执行父类中的版本;如果子类的对象用于调用该方法,则将执行子类中的版本。
可以使用@Override检查(compiler 会检查覆盖方法和被覆盖的方法签名是否完全一致)。
class A
{
public void f()
{
System.out.println("1");
}
}
class B extends A
{
public void f()
{
System.out.println("2");
}
}
public class Test
{
public static void main(String args[])
{
A a = new A();
A b = new B();
a.f();
b.f();
}
}
结果如下:
1
2
当需要在子类中调用父类的被重写方法时,要使用 super 关键字。
class A
{
public void f()
{
System.out.println("1");
}
}
class B extends A
{
public void f()
{
super.f(); // 应用super类的方法
System.out.println("2");
}
}
public class Test{
public static void main(String args[]){
A n= new A();
n.f();
}
}
结果如下:
1
2
二、重载(Overload)
函数重载是实现创建多个同名方法。
对重载函数的调用将根据调用的上下文运行该函数的特定实现,允许一个函数调用根据上下文执行不同的任务。重载是一种静态多态,根据参数列表进行最佳匹配,在编译阶段时决定要具体执行哪个方法。
public class A {
public int test(){
System.out.println("0");
return 1;
}
public void test(int a){
System.out.println("2");
}
public String test(int a,String s){
System.out.println("3");
return "4";
}
public static void main(String[] args){
A a = new A();
System.out.println(a.test());
a.test(1);
System.out.println(a.test(1,"abc"));
}
}
结果如下:
0
1
2
3
4
总结
重写和重载也都是JAVA作为面向对象编程的特点。