在课上听老师讲了关于方法重写和方法重载的问题,结合上课所给示例,查阅资料后对方法重写和重载有了一些思考。
一.首先是方法重写的概念
方法重写:子类从父类中继承方法,有时需要修改父类中定义的方法的实现。也就是说,可以在子类中继承或者修改父类中的方法。
重写时需要注意:
1.重写的方法必须与被重写的方法具有一样的签名,以及一样的或者是兼容的返回类型(重写方法的返回类型可以是被重写方法的返回类型的子类)。
2.声明为final,static的方法不能被重写,但是静态方法可以继承。
3.只有实例方法可以访问时,才能被重写。
重写的优势:重写建立在继承关系上。子类既可以根据自身需要,隐藏和访问父类的方法,也可以覆盖继承父类的方法,重写实现了对类中方法的扩充。
二.方法重载:重载意味着使用同样的名字但是不同的签名来定义多个方法。
与重写的区别在于重写必须要使用一样的签名或者兼容的返回类型在子类中定义方法。
注意:
1.方法的重载可以发生在同一个类中,也可以发生在具有继承关系的不同类中,而方法的重写发生在具有继承关系的不同类中。
2.方法重载具有相同的名字但是不同的参数列表,而方法重写具有相同的签名。
重写与重载举例:
class B{
public void m(double a){
System.out.println(a);
}
}
class A extends B{
public void m(double a){
System.out.println(a*2);
}
}
上面这个例子这是对类B中的方法进行重写
class A extends B{
public void m(int a){
System.out.println(a*2);
}
}
上面这个例子是对类B中的方法进行重载
三.有一种特殊的java语法,称为重写标注,在LAB2中已经使用过,即在子类方法的前面放一个@Override
父类中有此方法
public boolean add(L vertex);
那么在子类中实现时在方法之前加Override即可实现重写:
@Override
public boolean add(L vertex) {
if(vertices().contains(vertex)){
System.out.println("vertex already exist");
return false;
}
else {
checkRep();
return vertices.add(vertex);
}
}
要注意的是,如果有此标注的方法没有重写父类的方法的话,编译器将会报告一个错误。