overload與override的區(qū)別:
java多態(tài)之Override :
Override(重寫)是子類與父類的一種多態(tài)性體現(xiàn)。
Override允許子類改變父類的一些行為。
為什么需要Override:當(dāng)父類不滿足子類的一些要求時(shí)我們就需要子類對(duì)父類的一些行為進(jìn)行重寫。
例如:某公司里的員工的電話號(hào)碼不允許對(duì)外公開,而銷售人員(員工)的電話號(hào)碼則需要對(duì)外公開。
這時(shí)我們就可以這樣做:
Java代碼
public class Employee {
private String mobile;
public Employee(String mobile) {
this.mobile = mobile;
}
protected String showMess(){
return "電話號(hào)碼:"+mobile;
}
}
public class Employee {
private String mobile;
public Employee(String mobile) {
this.mobile = mobile;
}
protected String showMess(){
return "電話號(hào)碼:"+mobile;
}
}
員工類的showMess方法是protected的,所以位于其他包的對(duì)象是訪問不到的。
然后定義一個(gè)銷售人員的類(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;
}
}
注意這時(shí)被覆蓋的showMess方法的訪問級(jí)別是public,可以被任何其他對(duì)象訪問到。
關(guān)于Override有幾點(diǎn)要注意的地方:
1.被覆蓋方法的訪問控制級(jí)別可以不一樣。
例如上例父類的showMess方法的訪問級(jí)別為protected的,而子類覆蓋的showMess方法訪問級(jí)別則為public的。
但子類的訪問級(jí)別必須要高于父類被覆蓋方法的訪問級(jí)別,如果父類是public的而子類是protected的則是錯(cuò)誤的。
2.方法被定義為private或static或final的則不能被覆蓋。
3.方法的返回類型:子類的返回類型可以是更具體的對(duì)象,例如可以將Employee類的返回類型改為Object也正確。而倒過來則錯(cuò)誤。
4.在方法調(diào)用時(shí)先會(huì)在子類中找覆蓋的方法,如果子類中沒有則會(huì)在父類中去找。
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;
}
}
這段代碼的執(zhí)行結(jié)果為什么呢?如果你回答-1則錯(cuò)了,正確答案是3。
為什么呢?因?yàn)楦割惖膎um方法是private的,所以不能被覆蓋,所以子類的num方法不是一種Override,因此在子類找不到被覆蓋的num方法就會(huì)執(zhí)行父類的num方法。所以結(jié)果輸出為3.
Java代碼
public class Parent {
public int test(){
//執(zhí)行子類的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(){
//執(zhí)行子類的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;
}
}
那么這段代碼的執(zhí)行結(jié)果是-1,因?yàn)楦割恡est方法調(diào)用的是子類的num方法。
java overload的原則 :
在java中overload要遵循兩個(gè)原則:準(zhǔn)確性和唯一性
例一:
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");
}
}
在這個(gè)程序中, test.print(null)中的null即是String又是Object,那么要執(zhí)行那個(gè)函數(shù)呢?結(jié)果是它執(zhí)行了 public void print(String some),原因就是準(zhǔn)確性原則,String繼承自O(shè)bject.在java看來,在這個(gè)例子中說null是String類型的比說null是Object類型的更為準(zhǔn)確.
例二:
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類多了一個(gè)函數(shù),然而在編譯時(shí)出現(xiàn)了錯(cuò)誤.原因是該例違反了overload的唯一性原則
.String和StringBuffer之間不存在繼承關(guān)系,因此不能說null屬于它們兩個(gè)中的那個(gè)類更準(zhǔn)確,于是程序在執(zhí)行時(shí)就會(huì)不知道該調(diào)用public void print(String some),還是該調(diào)用 public void print(StringBuffer some).
原文地址:
http://www.software8.co/wzjs/java/1261.html