重載和覆蓋的區(qū)別都有哪些
重載和覆蓋是多態(tài)性的兩大主要表現(xiàn),學(xué)習(xí)代碼的朋友對此可能會有所了解,但是可能理解不深,下面是小編帶來的關(guān)于重載和覆蓋的區(qū)別的內(nèi)容,歡迎大家閱讀!
重載和覆蓋的區(qū)別
在同一個(gè)類中方法成員的名稱相同,但參數(shù)的類型和個(gè)數(shù)不同,這稱為重載。
在存在繼承關(guān)系的兩個(gè)話,子類與父類的方法成員名稱相同、參數(shù)的類型和個(gè)數(shù)相同的話,子類的方法覆蓋父類的方法,這稱為覆蓋。
下面舉個(gè)例子說明一下。例如:
class Shape {
void draw() {}
void erase() {}
}
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
void erase() {
System.out.println("Circle.erase()"); }
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
void erase() {
System.out.println("Square.erase()");
}
}
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
void erase() {
System.out.println("Triangle.erase()");
}
}
public class Test {
public static Shape randShape() {
switch((int)(Math.random() * 3)) {
default:
case 0: return new Circle();
case 1: return new Square();
case 2: return new Triangle();
} }
public static void main(String[] args) {
Shape[] s = new Shape[9];
for(int i = 0; i < s.length; i++)
s[i] = randShape();
for(int i = 0; i < s.length; i++)
s[i].draw();
}
}
輸出結(jié)果
Triangle.draw()
Circle.draw()
Triangle.draw()
Triangle.draw()
Triangle.draw()
Square.draw()
Square.draw()
Triangle.draw()
Circle.draw()
Triangle.erase()
Circle.erase()
Triangle.erase()
Triangle.erase()
Triangle.erase()
Square.erase()
Square.erase()
Triangle.erase()
Circle.erase()
Press any key to continue...
又一次執(zhí)行
Triangle.draw()
Triangle.draw()
Circle.draw()
Circle.draw()
Circle.draw()
Triangle.draw()
Triangle.draw()
Square.draw()
Circle.draw()
Triangle.erase()
Triangle.erase()
Circle.erase()
Circle.erase()
Circle.erase()
Triangle.erase()
Triangle.erase()
Square.erase()
Circle.erase()
Press any key to continue...
兩次執(zhí)行結(jié)果不同的原因是其中的Math.random()這個(gè)類導(dǎo)致的,math.random()得到的數(shù)是0-1之間的隨機(jī)數(shù)。
不過,最重要的一點(diǎn)區(qū)別是:通過方法重載進(jìn)而實(shí)現(xiàn)對象的多態(tài)性。
方法重載是指功能相同的多個(gè)方法使用同一個(gè)方法名。同名的多個(gè)方法的參數(shù)要有所不同,即在參數(shù)類型,參數(shù)個(gè)數(shù)和參數(shù)順序上要有所區(qū)別,以便作為選擇某個(gè)方法的根據(jù)。通常只有功能相同的方法進(jìn)行重載才有意義。
例如:計(jì)算兩個(gè)數(shù)之和的重載方法定義如下:
int add(int i,int j)
{retrun i+j;}
float add(float i,float j)
{retrun i+j;}
double add(double i,double j)
{retrun i+j;}
重載方法的選擇通常是在編譯時(shí)進(jìn)行。系統(tǒng)根據(jù)不同的參數(shù)類型,個(gè)數(shù)或順序,尋找最佳匹配方法.方法類型不參與匹配。
重載和覆蓋的介紹
多態(tài)性也是面向?qū)ο蠓椒ǖ囊粋€(gè)重要特性.多態(tài)性是指在在程序中出現(xiàn)的"重名"現(xiàn)象,即在一個(gè)程序中相同的名字可以表示不同的實(shí)現(xiàn).
在JAVA中,多態(tài)性主要表現(xiàn)在如下兩個(gè)方面:
(1)方法重載.通常指在同一個(gè)類中,相同的方法名對應(yīng)著不同的方法實(shí)現(xiàn),但是方法的參數(shù)不同.
(2)成員覆蓋.通常指在不同類(父類和子類)中,允許有相同的變量名,但是數(shù)據(jù)類型不同;也允許有相同的方法名,但是對應(yīng)的方法實(shí)現(xiàn)不同.
在重載的情況下,同一類中具有相同的名字的方法.如何選擇它的方法體呢?不能使用類名來區(qū)分,通常采用不同的方法形參表,區(qū)分重載要求形參在類型,個(gè)數(shù)和順序的不同,在定義重載方法時(shí),應(yīng)在方法的形參的類型,個(gè)數(shù)和順序有所不同,以便在選擇時(shí)能夠區(qū)別開來.
在覆蓋的情況下,同名的方法存在于不同的類中,在調(diào)用方法只要指明其方法所歸屬的類名就可以了.
重載與覆蓋的具體例子
public class Base{
int a,b;
public Base(int x,int y){
a = x;
b = y;
}
public int add(){
return (a + b);
}
public void add(int x,int y){
int z;
z = x + y;
}
}
上面這段代碼就是重載的三個(gè)特征 :
1:方法名必須一樣 “add()“。
2:返回類型可以不一樣 就象是 ”int “和”void“.
3:參數(shù)可以不一樣 就是add() 和add(int x,int y)這樣的。
public class Base{
int x,y;
public void add(){
int z;
z = x + y;
}
}
public class Child extends Base{
int x,y;
public void add(){
int z;
z = x + y;
}
public static void main(string [] args){
Base b = new Child();
b.add();
}
}
下面這個(gè)例子就是重寫,他實(shí)現(xiàn)了多態(tài)。
重寫的要求是,方法名必須一樣,返回類型必須一樣,傳入的參數(shù)必須一樣。
在main函數(shù)中定義父類的對象,但是用子類去實(shí)例化他,這樣就可以通過父類的對象調(diào)用到子類的方法。
下面舉個(gè)例子,例如:
public class Parent {
public int addValue( int a, int b) {
int s;s = a+b;return s;
}
}
class Child extends Parent {
}
Which methods can be added into class Child?
a int addValue( int a, int b ){// do something...}
b public void addValue (){// do something...}
c public int addValue( int a ){// do something...}
d public int addValue( int a, int b )throws MyException {//do something...}
答案為B.C
解釋1:
a是覆蓋,b ,c是重載。
a的問題出在訪問權(quán)限上,如果換成public也是可以的。
d是異常的問題。
解釋2:
a的訪問權(quán)限小于父類,所以錯(cuò)誤,d是異常錯(cuò)誤,b和c中的addValue方法和父類的方法參數(shù)不同,所以是重載。
猜你感興趣: