下面將分別講解重載與重寫:
創(chuàng)新互聯(lián)成立十余年來,這條路我們正越走越好,積累了技術與客戶資源,形成了良好的口碑。為客戶提供成都網(wǎng)站設計、網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)頁設計、主機域名、網(wǎng)絡營銷、VI設計、網(wǎng)站改版、漏洞修補等服務。網(wǎng)站是否美觀、功能強大、用戶體驗好、性價比高、打開快等等,這些對于網(wǎng)站建設都非常重要,創(chuàng)新互聯(lián)通過對建站技術性的掌握、對創(chuàng)意設計的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進步。
1、重載overloading
1) 方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。多個同名函數(shù)同時存在,具有不同的參數(shù)個數(shù)/類型。重載是一個類中多態(tài)性的一種表現(xiàn)。
2) Java的方法重載,就是在類中可以創(chuàng)建多個方法,它們具有相同的名字,但具有不同的參數(shù)和不同的定義。調(diào)用方法時通過傳遞給它們的不同參數(shù)個數(shù)和參數(shù)類型給它們的不同參數(shù)個數(shù)和參數(shù)類型給它們的不同參數(shù)個數(shù)和參數(shù)類型來決定具體使用哪個方法, 這就是多態(tài)性。
3) 重載的時候,方法名要一樣,但是參數(shù)類型和個數(shù)不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數(shù)的區(qū)分標準。
示例代碼:
public class Dog {
Dog()
{
this.bark();
}
void bark()//bark()方法是重載方法
{
System.out.println("no barking!");
this.bark("female", 3.4);
}
void bark(String m,double l)//注意:重載的方法的返回值都是一樣的,
{
System.out.println("a barking dog!");
this.bark(5, "China");
}
void bark(int a,String n)//不能以返回值區(qū)分重載方法,而只能以“參數(shù)類型”和“類名”來區(qū)分
{
System.out.println("a howling dog");
}
public static void main(String[] args)
{
Dog dog = new Dog();
//dog.bark();
//dog.bark("male", "yellow");
//dog.bark(5, "China");
}
}
2、重寫overriding
1) 父類與子類之間的多態(tài)性,對父類的函數(shù)進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。
2) 若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數(shù)表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
3) 子類函數(shù)的訪問修飾權限不能少于父類的;
示例代碼:
public class Base
{
void test(int i)
{
System.out.print(i);
}
void test(byte b)
{
System.out.print(b);
}
}
public class TestOverriding extends Base
{
void test(int i)
{
i++;
System.out.println(i);
}
public static void main(String[]agrs)
{
Base b=new TestOverriding();
b.test(0)
b.test((byte)0)
}
}
這時的輸出結(jié)果是1 0,這是運行時動態(tài)綁定的結(jié)果。
因為你沒有指定數(shù)據(jù)類型,所以默認用int類型給你,double或者float等等都一樣,只是數(shù)據(jù)類型改一下而已。
public class Test {
public int max(int a, int b) {
int intMax = Math.max(a, b);
return intMax;
}
public int max(int a, int b, int c) {
// 可以直接調(diào)用本類的max(int a, int b)方法,起到代碼重復利用效果
int intMax = max(a, b);
intMax = max(intMax, c);
return intMax;
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.max(2, 1));
System.out.println(t.max(2, 6, 5));
}
}
Exception in thread "main"java.lang.NoSuchMethodError: main
就是缺少main方法
編寫一個測試類,就是入口方法--main方法
你的這段代碼編譯是通的過的,方法重載是對的 。
樓上正解,把兩個方法里面的int a,b,c;和double a,b,c;去掉,
因為你需要的是把a,b,c做參數(shù)傳進去,你再定義int a,b,c這樣三個屬性,導致下面 average=(a+b+c)/3;這個地方就不知道你這個a,b,c到底是屬性,還是參數(shù)。
如果你還是不理解,你就把屬性的a,b,c換成x,y,z這樣程序能運行,但是會報警告,說屬性x,y,z你定義了,但是從來沒用過,也就是說是多余的。
public double aver(int a,int b,int c) {
int x,int y,int z;//將原來的a,b,c換成x,y,z便于你理解,也可以刪掉這行代碼。
double average;
average=(a+b+c)/3;
return average;
}
public double aver(double a,double b,double c) {
double x, double y, double z;//同上
double average;
average=(a+b+c)/3;
return average;
}
直接看代碼:
import?java.util.Scanner;
public?class?What?{
public?static?void?main(String[]?args)?throws?Exception?{
int?x,?y,?z;
Scanner?in?=?new?Scanner(System.in);
x?=?in.nextInt();
y?=?in.nextInt();
z?=?in.nextInt();
in.close();
int?result;
if?(x??0)?{
result?=?f();
}?else?if?(x?=?0??y??0)?{
result?=?f(x);
}?else?if?(x?=?0??y?=?0??z??0)?{
result?=?f(x,?y);
}?else?{
result?=?f(x,?y,?z);
}
System.out.println(result);
}
public?static?int?f()?{
return?0;
}
public?static?int?f(int?x)?{
return?x?*?x;
}
public?static?int?f(int?x,?int?y)?{
return?x?*?x?+?y?*?y;
}
public?static?int?f(int?x,?int?y,?int?z)?{
return?x?*?x?+?y?*?y?+?z?*?z;
}
}
方法重載:
1.必須在同一個類
2.方法名相同
3.方法參數(shù)個數(shù)或參數(shù)類型(或參數(shù)順序)不同
注:
1.參數(shù)順序指的是參數(shù)類型順序,與參數(shù)名字無關,比如show(int a,,Stringa,int c)和show(int ? ? ?c,String b,int a)是一樣的方法,非方法重載,因為他們的參數(shù)類型順序一樣是int,String,int
2.方法重載與訪問權限修飾符和方法返回值無關
調(diào)用:
1.當調(diào)用的時候,填好方法參數(shù)時,它會自動判斷參數(shù)類型,參數(shù)類型順序,個數(shù),然后再調(diào)用相應的重載 ? ? ?方法,當匹配不到相應的重載方法,那么直接編譯錯誤
例子:
方法1. show()
方法2. show(int a,int b)
方法3. show(int a,String b)
方法4. show(String b,int a)
方法5. show(int b,int a)
1. 方法1.2.3.4是重載方法(1與[234]參數(shù)個數(shù)不同,2與[34]參數(shù)類型不同,3與[4]參數(shù)類型順序不同)
2. 方法1.3.4.5是重載方法(1與[534]參數(shù)個數(shù)不同,5與[34]參數(shù)類型不同,3與[4]參數(shù)類型順序不同)
3. 方法2和5非方法重載,因為參數(shù)類型順序一樣,跟參數(shù)名字無關
4. 以方法1.2.3.4為例,show()會調(diào)用方法1,show(1,1)會調(diào)用方法2,show(1,"1")會調(diào)用方法3
show("1",1)會調(diào)用方法4
----------------------------------------------------------------------------------------------------------------
你兩個方法名分別是test1,test2,方法名不同,肯定不是方法重載,而且構(gòu)造方法名必須跟類名一樣,不可能出現(xiàn)不同名的構(gòu)造方法
2.假如test(int i,String s){} ? ? ? test(String s,int i){}
那么這2個構(gòu)造方法是重載,不會出現(xiàn)編譯錯誤,因為參數(shù)類型順序不同,第一個構(gòu)造方法參數(shù)類型順序是int,String,第二個構(gòu)造方法參數(shù)類型順序是String,int