成员方法的继承与覆盖与成员变量的继承与覆盖类似,但有区别。
类似在于可以继承的成员变量和成员方法的类型是相同的,可以继父类的public和protected成员方法。
区别在于成员方法是真的覆盖,定义与父类相同的方法之后,在父类中相同的方法在子类中是不存在的。
首先要确定什么是相同的方法?相同的方法指的是:方法名相同、参数个数相同、参数类型相同、返回值类型。与参数的名字无关。
例如,下面的方法是相同的方法:
public void setAge(int age){...}
public void setAge(int sage){...}
下面的方法是不同的方法:
public void setAge(int age){...}
public void setAge(String age){...}
注意:子类在覆盖父类的方法的时候,不能修改返回值类型,不能缩小访问权限,下面的两种方式都是错误的。
父类中:
public int getA(){
return a;
}
子类中:
protected int getA(){ // 缩小了访问权限
return a;
}
public String getA(){ // 修改了返回值类型
return String.valueOf(a);
}
方法用于定义行为,方法的覆盖是子类修改了父类中该行为的实现方式。方法的覆盖与多态有关。
如果方法没有覆盖,会直接继承,如果被覆盖,父类的该方法在子类中就不存在了。
下面这道题,会是什么结果呢?
package test;
public class Parent {
public int a=10;
public int getA(){
return a;
}
}
package test;
public class Child extends Parent{
public int a=20;
public int getParentA(){
return super.a;
}
public int getChildA(){
return a;
}
}
package test;
public class Test {
public static void main(String args[]){
Child child = new Child();
System.out.println(((Parent)child).a);
System.out.println(child.getParentA());
System.out.println(child.getChildA());
System.out.println(child.getA());
}
}
查看运行结果:
10
10
20
10
请注意最后一个。