overload與override的區別:
java多態之Override :
Override(重寫)是子類與父類的一種多態性體現。
Override允許子類改變父類的一些行為。
為什么需要Override:當父類不滿足子類的一些要求時我們就需要子類對父類的一些行為進行重寫。
例如:某公司里的員工的電話號碼不允許對外公開,而銷售人員(員工)的電話號碼則需要對外公開。
這時我們就可以這樣做:
Java代碼
public class Employee {
private String mobile;
public Employee(String mobile) {
this.mobile = mobile;
}
protected String showMess(){
return "電話號碼:"+mobile;
}
}
public class Employee {
private String mobile;
public Employee(String mobile) {
this.mobile = mobile;
}
protected String showMess(){
return "電話號碼:"+mobile;
}
}
員工類的showMess方法是protected的,所以位于其他包的對象是訪問不到的。
然后定義一個銷售人員的類(Sales),并繼承Employee類
Java代碼
public class Sales extends Employee{
//子類除了具有父類的一些屬性,也可以有自己的一些屬性
private String msn;
public Sales(String mobile,String msn) {
super(mobile);
this.msn = msn;
}
@Override
public String showMess() {
return super.showMess()+"==msn:"+this.msn;
}
}
public class Sales extends Employee{
//子類除了具有父類的一些屬性,也可以有自己的一些屬性
private String msn;
public Sales(String mobile,String msn) {
super(mobile);
this.msn = msn;
}
@Override
public String showMess() {
return super.showMess()+"==msn:"+this.msn;
}
}
注意這時被覆蓋的showMess方法的訪問級別是public,可以被任何其他對象訪問到。
關于Override有幾點要注意的地方:
1.被覆蓋方法的訪問控制級別可以不一樣。
例如上例父類的showMess方法的訪問級別為protected的,而子類覆蓋的showMess方法訪問級別則為public的。
但子類的訪問級別必須要高于父類被覆蓋方法的訪問級別,如果父類是public的而子類是protected的則是錯誤的。
2.方法被定義為private或static或final的則不能被覆蓋。
3.方法的返回類型:子類的返回類型可以是更具體的對象,例如可以將Employee類的返回類型改為Object也正確。而倒過來則錯誤。
4.在方法調用時先會在子類中找覆蓋的方法,如果子類中沒有則會在父類中去找。
Java代碼
public class Parent {
private int num(int i,int j){
return i+j;
}
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.num(1, 2));
}
}
class Child extends Parent{
public int num(int x,int y){
return x-y;
}
}
public class Parent {
private int num(int i,int j){
return i+j;
}
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.num(1, 2));
}
}
class Child extends Parent{
public int num(int x,int y){
return x-y;
}
}
這段代碼的執行結果為什么呢?如果你回答-1則錯了,正確答案是3。
為什么呢?因為父類的num方法是private的,所以不能被覆蓋,所以子類的num方法不是一種Override,因此在子類找不到被覆蓋的num方法就會執行父類的num方法。所以結果輸出為3.
Java代碼
public class Parent {
public int test(){
//執行子類的num方法
return num(1,2);
}
protected int num(int i,int j){
return i+j;
}
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.test());
}
}
class Child extends Parent{
public int num(int x,int y){
return x-y;
}
}
public class Parent {
public int test(){
//執行子類的num方法
return num(1,2);
}
protected int num(int i,int j){
return i+j;
}
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.test());
}
}
class Child extends Parent{
public int num(int x,int y){
return x-y;
}
}
那么這段代碼的執行結果是-1,因為父類test方法調用的是子類的num方法。
java overload的原則 :
在java中overload要遵循兩個原則:準確性和唯一性
例一:
public class TestOverLoad
{
public static void main(String[] args)
{
Test test = new Test();
test.print(null);
}
}
class Test
{
public void print(String some)
{
System.out.println("String version print");
}
public void print(Object some)
{
System.out.println("Object version print");
}
}
在這個程序中, test.print(null)中的null即是String又是Object,那么要執行那個函數呢?結果是它執行了 public void print(String some),原因就是準確性原則,String繼承自Object.在java看來,在這個例子中說null是String類型的比說null是Object類型的更為準確.
例二:
public class TestOverLoad
{
public static void main(String[] args)
{
Test test = new Test();
test.print(null);
}
}
class Test
{
public void print(String some)
{
System.out.println("String version print");
}
public void print(Object some)
{
System.out.println("Object version print");
}
public void print(StringBuffer some)
{
System.out.println("StringBuffer version print");
}
}
在該例中,Test類多了一個函數,然而在編譯時出現了錯誤.原因是該例違反了overload的唯一性原則