方法重載時編譯處理
❶ java中方法重載和重寫的區別
重載overloading
1)方法重載是讓類以統一的方式處理不同類型數據的一種手段。多個同名函數同時存在,具有不同的參數個數/類型。重載是一個類中多態性的一種表現。
2)Java的方法重載,就是在類中可以創建多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型給它們的不同參數個數和參數類型給它們的不同參數個數和參數類型來決定具體使用哪個方法,這就是多態性。
3)重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數的區分標准。
例子
packagec04.answer;//這是包名
//這是這個程序的第一種編程方法,在main方法中先創建一個Dog類實例,然後在Dog類的構造方法中利用this關鍵字調用不同的bark方法。不同的重載方法bark是根據其參數類型的不同而區分的。
//注意:除構造器以外,編譯器禁止在其他任何地方中調用構造器。
packagec04.answer;
publicclassDog{
Dog(){
this.bark();
}
voidbark()//bark()方法是重載方法
{
System.out.println("nobarking!");
this.bark("female",3.4);
}
voidbark(Stringm,doublel)//注意:重載的方法的返回值都是一樣的,
{
System.out.println("abarkingdog!");
this.bark(5,"China");
}
voidbark(inta,Stringn)//不能以返回值區分重載方法,而只能以「參數類型」和「類名」來區分
{
System.out.println("ahowlingdog");
}
publicstaticvoidmain(String[]args)
Dogdog=newDog();
//dog.bark();
//dog.bark("male","yellow");
//dog.bark(5,"China");重寫overriding
1)父類與子類之間的多態性,對父類的函數進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫(Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
2)若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
3)子類函數的訪問修飾許可權不能少於父類的;
例子
publicclassBase
{
voidtest(inti)
{
System.out.print(i);
}
voidtest(byteb)
{
System.out.print(b);
}
}
{
voidtest(inti)
{
i++;
System.out.println(i);
}
publicstaticvoidmain(String[]agrs)
{
Baseb=newTestOverriding();
b.test(0)
b.test((byte)0)
}
}
這時的輸出結果是10,這是運行時動態綁定的結果。
總結:重載和重寫(覆蓋)
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫(Overriding)。子類的對象使用這個方法時,
將調用子類中的定義,對它而言,父類中的定義如同被「屏蔽」了,而且如果子類的方法名和參數類型和個數都和父類相同,那麼子類的返回值類型必須和父類的相同;如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載。Overloaded的方法
是可以改變返回值的類型。也就是說,重載的返回值類型可以相同也可以不同。
附錄:動態綁定即調用對象方法的機制
1)編譯器檢查對象聲明的類型和方法名,從而獲取所有候選方法。試著把上例Base類的test注釋掉,這時再編譯就無法通過。
2)重載決策:編譯器檢查方法調用的參數類型,從上述候選方法選出唯一的那一個(其間會有隱含類型轉化)。如果編譯器找到多於一個或者沒找到,此時編譯器就會報錯。試著把上例Base類的test(byteb)注釋掉,這時運行結果是11。
3)若方法類型為priavtestaticfinal,java採用靜態編譯,編譯器會准確知道該調用哪個方法。
4)當程序運行並且使用動態綁定來調用一個方法時,那麼虛擬機必須調用對象的實際類型相匹配的方法版本。在例子中,b所指向的實際類型是TestOverriding,所以b.test(0)調用子類的test。但是,子類並沒有重寫test(byteb),所以b.test((byte)0)調用的是父類
的test(byteb)。如果把父類的(byteb)注釋掉,則通過第二步隱含類型轉化為int,最終調用的是子類的test(inti)。
❷ Java里,重載的方法為何是靜態編譯,而沒有重載的方法卻是動態編譯這么設計有什麼原因嗎
java允許在一個類中,多個方法擁有相同的名字,但在名字相同的同時,必須有不同的參數,這就是重載,編譯器會根據實際情況挑選出正確的方法,如果編譯器找不到匹配的參數或者找出多個可能的匹配就會產生編譯時錯誤,這個過程被稱為重載的解析
1 普通方法的重載
普通方法的重載是Java實現多態技術的重要手段,為編程帶來了很多便利
當方法同名時,為了讓編譯器區別他們,至少需要下面之一不同
1 參數個數不同
2 對應位置上的參數類型不同
不允許參數完全相同而只是返回值不同的情況出現。無法進行編譯,程序在eclips中顯示錯誤
2 構造方法的重載
見文章構造方法的繼承
重載的解析
當類的設計者提供了重載方法之後,類的使用者在使用這些方法時編譯器需要確定調用哪一個方法,確定的唯一依據是參數列表,確定的過程被稱為重載的解析。
以下舉些例子說明:
show(int a ,int b,int c) //1
show(int a ,int b,double c) //2
show(int a ,double b,double c)//3
show(double a,double b,int c) //4
下面是調用
show(1,2,3);//1,2,3,4都是可行方法所有參數完全匹配1
show(1.0,2.0,3.0);//沒有一個可行方法
show(1.0,2,3);//4是最佳可行方法
show(1,2.0,3);//3,4都是可行方法,沒有最佳可行方法,報錯
重載和覆蓋都是多態的表現,他們在某些地方很相似,很容易引起初學者的疑惑,這里將它們之間的區別總結如下
1 重載和覆蓋的方法名稱都相同,但重載要求參數列表不同,而覆蓋要求參數列表完全相同。
2 重載對於方法前面的修飾符沒有限制,而覆蓋則對這些修飾符的使用有限制
3 重載時編譯器在編譯期間就可以確定調用那一個方法,而覆蓋則有可能在運行期間才能確定。
❸ 什麼是方法重載Java編譯器如何選擇實際使用的方法
方法重載是相同方法名,但參數不同,返回類型可以相同也可以不同~參數的不同可以是類型不同,也可以是參數個數不同,比如在一個類里寫:
class C{
public int a(int i){
方法體
}
public int a(String i){
方法體//方法體不必相同
}
public void a(int i,int j){
方法體//方法體不必相同
}
}
編譯器選擇實際使用方法是根據參數來選擇到底使用哪個方法的
比如
C c=new C();
c.a(1);//調用第一個方法
c.a(2,3)//調用第三個方法
(注:不要把重載和重寫弄錯了,重寫是繼承里對方法進行重寫,方法頭要相同的,除了限制使用范圍不能比父類方法更嚴,是對方法體的重寫)
❹ 什麼是重載方法,什麼是覆蓋方法,主要區別
一、重載方法:方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數的類型或參數的個數。調用重載方法時,Java編譯器能通過檢查調用的方法的參數類型和個數選擇一個恰當的方法。
方法重載通常用於創建完成一組任務相似但參數的類型或參數的個數或參數的順序不同的方法。Java的方法重載,就是在類中可以創建多個方法,它們可以有相同的名字,但必須具有不同的參數,即或者是參數的個數不同,或者是參數的類型不同。
調用方法時通過傳遞給它們的不同個數和類型的參數,以及傳入參數的順序來決定具體使用哪個方法
二、覆蓋方法:在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想做一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
兩者的區別:
1、子類與父類的關系不同:覆蓋方法中的子類與父類之間是垂直關系;在重載方法中因為兩個方法在同一個類中,所以是不同方法之間的水平關系。
2、映射關系不同:覆蓋只能由一個方法,或只能由一對方法產生關系;在重載方法時,多個方法之間發生變化。
3、對於參數列表的需求不同:覆蓋要求參數列表相同;重載要求參數列表不同。
(4)方法重載時編譯處理擴展閱讀:
java的特點:
1、高性能
Java是一種先編譯後解釋的語言,所以它不如全編譯性語言快。但是有些情況下性能是很要緊的,為了支持這些情況,Java設計者製作了「及時」編譯程序,它能在運行時把Java位元組碼翻譯成特定CPU的機器代碼,也就是實現全編譯了。
Java位元組碼格式設計時考慮到這些「及時」編譯程序的需要,所以生成機器代碼的過程相當簡單,它能產生相當好的代碼。
2、多線索性
Java是多線索語言,它提供支持多線索的執行,能處理不同任務,使具有線索的程序設計很容易。Java的lang包提供一個Thread類,它支持開始線索、運行線索、停止線索和檢查線索狀態的方法。
Java的線索支持也包括一組同步原語。這些原語是基於監督程序和條件變數風范,由C.A.R.Haore開發的廣泛使用的同步化方案。用關鍵詞synchronized,程序員可以說明某些方法在一個類中不能並發地運行。這些方法在監督程序控制之下,確保變數維持在一個一致的狀態。
3、動態性
Java語言設計成適應於變化的環境,它是一個動態的語言。例如,Java中的類是根據需要載入的,甚至有些是通過網路獲取的。
參考資料來源:
網路-方法重載
網路-方法覆蓋
❺ c++怎樣處理重載函數編譯之後的函數符號問題
對每一個函數 都會生成一個符號
對於不同的重載都會生成不同的符號
比如
如果有一個函數int add(int, int)
那麼用C編譯後 它的符號就是add
而用C++編譯後 它的符號可能是這樣的
_Z3addii
如果再加上一個float add(float, float)的重載 那麼它就會多一個這樣的符號
_Z3addff
也就是對於每個重載 都會有一個根據參數類型生成的後綴 表示不同的含義
PS:在編譯後 可以通過nm查看符號名(gcc/g++)
❻ 什麼是方法重載方法重載的規則是什麼
方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數的類型或參數的個數。調用重載方法時,Java編譯器能通過檢查調用的方法的參數類型和個數選擇一個恰當的方法。方法重載通常用於創建完成一組任務相似但參數的類型或參數的個數或參數的順序不同的方法。
一、方法名一定要相同。
二、方法的參數表必須不同,包括參數的類型或個數,以此區分不同的方法體。
1、如果參數個數不同,就不管它的參數類型了!
2、如果參數個數相同,那麼參數的類型必須不同。
三、方法的返回類型、修飾符可以相同,也可不同。
(6)方法重載時編譯處理擴展閱讀:
Java的方法重載,就是在類中可以創建多個方法,它們可以有相同的名字,但必須具有不同的參數,即或者是參數的個數不同,或者是參數的類型不同。
調用方法時通過傳遞給它們的不同個數和類型的參數,以及傳入參數的順序來決定具體使用哪個方法。
❼ Java編譯器如何生成重載和覆蓋方法代碼
舉個簡單的例子,展示了多態性(Polymorphism):重載(Overloaded)和覆蓋(Overridden)。
多態性意味著方法可以在不同的時刻表現出不同的形式。在編譯期間,這被稱為方法重載。重載允許相關的方法可以使用相同的方法名訪問。有時候這被稱為ad hoc polymorphism,與parametric polymorphism 不同。
輸出:
intstringoverriden int
從編譯器的角度講,如何生成能夠正確調用的函數的代碼?
靜態重載(Static overloading)不難實現。當處理一個重載方法的聲明時,一個新的綁定會被映射到一個不同的實現。在處理類型檢查的過程中,編譯器會分析參數的實際類型,然後決定使用哪個方法。
動態重載(Dynamic overloading )允許運行時根據實際參數的類型來選擇函數的不同實現。這是動態調度(dynamic dispatch)的一種形式。
動態調度也被用來實現方法覆蓋。被覆蓋的方法的調用由運行期間實際對象的類型決定的。
❽ java中的方法重載
重載
含義: 只要方法名相同,參數表不同,就可以構成方法重載。
方法重載,在JAVA中,也叫: 編譯時多態。(由編譯的時候來確定調用哪個方法)
重載的原則: 向上就近匹配原則
注意: 如果只有print( double d ) 方法,而要調用 print(int) ,則編譯器會自動地就近向上匹配 print(double) 方法。但是反過來就不行,
因為從大到小會丟失精度, 所以,沒有就近向下匹配原則.
關鍵字: this
This: 指當前對象的。 。 。
有兩種用法:
表示當前對象: this.age = age; this.name = name;
在調用本類的其它構造方法時。 This(參數表), 註:this的這種用法只能放在第一行。
方法調用:傳值, 傳引用
記住: 在JAVA中,簡單類型變數一定是傳值。 對象變數一這是傳引用(也就是指向對象的首地址)
❾ 簡述方法重載和方法重寫的區別
、方法重寫(0veriding)
在Java程序中,類的繼承關系可以產生一個子類,子類繼承父類,它具備了父類所有的特徵,繼承了父類所有的方法和變數。
子類可以定義新的特徵,當子類需要修改父類的一些方法進行擴展,增大功能,程序設計者常常把這樣的一種操作方法稱為重寫,也叫稱為覆寫或覆蓋。
重寫體現了Java優越性,重寫是建立在繼承關繫上,它使語言結構更加豐富。在Java中的繼承中,子類既可以隱藏和訪問父類的方法,也可以覆蓋繼承父類的方法。
在Java中覆蓋繼承父類的方法就是通過方法的重寫來實現的。所謂方法的重寫是指子類中的方法與父類中繼承的方法有完全相同的返回值類型、方法名、參數個數以及參數類型。
這樣,就可以實現對父類方法的覆蓋。如果子類將父類中的方法重寫了,調用的時候肯定是調用被重寫過的方法,那麼如果現在一定要調用父類中的方法該怎麼辦呢?
此時,通過使用super關鍵就可以實現這個功能,super關鍵字可以從子類訪問父類中的內容,如果要訪問被重寫過的方法,使用「super.方法名(參數列表)」的形式調用。
如果要使用super關鍵字不一定非要在方法重寫之後使用,也可以明確地表示某個方法是從父類中繼承而來的。使用super只是更加明確的說,要從父類中查找,就不在子類查找了。
重寫的好處在於子類可以根據需要,定義特定於自己的行為。
也就是說子類能夠根據需要實現父類的方法。
在面向對象原則里,重寫意味著可以重寫任何現有方法。實例如下:
class Animal{
public void move(){
System.out.println("動物可以移動");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 對象
Animal b = new Dog(); // Dog 對象
a.move();// 執行 Animal 類的方法
b.move();//執行 Dog 類的方法
}
}
//運行結果
動物可以移動
狗可以跑和走
在上面的例子中可以看到,盡管b屬於Animal類型,但是它運行的是Dog類的move方法。
這是由於在編譯階段,只是檢查參數的引用類型。
然而在運行時,Java虛擬機(JVM)指定對象的類型並且運行該對象的方法。
因此在上面的例子中,之所以能編譯成功,是因為Animal類中存在move方法,然而運行時,運行的是特定對象的方法。
思考以下例子:
class Animal{
public void move(){
System.out.println("動物可以移動");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 對象
Animal b = new Dog(); // Dog 對象
a.move();// 執行 Animal 類的方法
b.move();//執行 Dog 類的方法
b.bark();
}
}
//以上實例編譯運行結果如下:
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal
該程序將拋出一個編譯錯誤,因為b的引用類型Animal沒有bark方法。
二、重寫規則
在重寫方法時,需要遵循以下的規則:
(一) 父類方法的參數列表必須完全與被子類重寫的方法的參數列表相同,否則不能稱其為重寫而是重載。
(二) 父類的返回類型必須與被子類重寫的方法返回類型相同,否則不能稱其為重寫而是重載。
(三) Java中規定,被子類重寫的方法不能擁有比父類方法更加嚴格的訪問許可權。編寫過Java程序的人就知道,父類中的方法並不是在任何情況下都可以重寫的,當父類中方法的訪問許可權修飾符為private時,該方法只能被自己的類訪問,不能被外部的類訪問,在子類是不能被重寫的。如果定義父類的方法為public,在子類定義為private,程序運行時就會報錯。
(四) 由於父類的訪問許可權修飾符的限制一定要大於被子類重寫方法的訪問許可權修飾符,而private許可權最小。所以如果某一個方法在父類中的訪問許可權是private,那麼就不能在子類中對其進行重寫。如果重新定義,也只是定義了一個新的方法,不會達到重寫的效果。
(五) 在繼承過程中如果父類當中的方法拋出異常,那麼在子類中重寫父類的該方法時,也要拋出異常,而且拋出的異常不能多於父類中拋出的異常(可以等於父類中拋出的異常)。換句話說,重寫方法一定不能拋出新的檢查異常,或者比被重寫方法聲明更加寬泛的檢查型異常。例如,父類的一個方法申明了一個檢查異常IOException,在重寫這個方法時就不能拋出Exception,只能拋出IOException的子類異常,可以拋出非檢查異常。同樣的道理,如果子類中創建了一個成員變數,而該變數和父類中的一個變數名稱相同,稱作變數重寫或屬性覆蓋。但是此概念一般很少有人去研究它,因為意義不大。
Super關鍵字的使用
當需要在子類中調用父類的被重寫方法時,要使用super關鍵字。
三、方法重載(Overloading)
方法重載是讓類以統一的方式處理不同類型數據的一種手段。調用方法時通過傳遞給它們的不同個數和類型的參數來決定具體使用哪個方法,這就是多態性。
所謂方法重載是指在一個類中,多個方法的方法名相同,但是參數列表不同。參數列表不同指的是參數個數、參數類型或者參數的順序不同。
方法的重載在實際應用中也會經常用到。不僅是一般的方法,構造方法也可以重載。
在方法重載時,方法之間需要存在一定的聯系,因為這樣可以提高程序的可讀性,一般只重載功能相似的方法。
重載是指我們可以定義一些名稱相同的方法,通過定義不同的參數來區分這些方法,然後再調用時,Java虛擬機就會根據不同的參數列表來選擇合適的方法執行。也就是說,當一個重載方法被調用時,Java用參數的類型或個數來決定實際調用的重載方法。因此,每個重載方法的參數的類型或個數必須是不同。
雖然每個重載方法可以有不同的返回類型,但返回類型並不足以區分所使用的是哪個方法。
當Java調用一個重載方法是,參數與調用參數匹配的方法被執行。在使用重載要注意以下的幾點:
1.在使用重載時只能通過不同的參數列表,必須具有不同的參數列表。
2.不能通過訪問許可權、返回類型、拋出的異常進行重載。
3.方法的異常類型和數目不會對重載造成影響。
4.可以有不同的返回類型,只要參數列表不同就可以了。
5.可以有不同的訪問修飾符。
6.可以拋出不同的異常。
重載(overloading) 是在一個類裡面,方法名字相同,而參數不同。返回類型呢?可以相同也可以不同。
每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。
只能重載構造函數
四、重載規則
被重載的方法必須改變參數列表;
被重載的方法可以改變返回類型;
被重載的方法可以改變訪問修飾符;
被重載的方法可以聲明新的或更廣的檢查異
五、訪問修飾符
訪問修飾符 本類 同包 子類 其他
private √
默認 √ √
protected √ √ √
public √ √ √
重寫與重載之間的區別
方法重載:
1、同一個類中
2、方法名相同,參數列表不同(參數順序、個數、類型)
3、方法返回值、訪問修飾符任意
4、與方法的參數名無關
方法重寫:
1、有繼承關系的子類中
2、方法名相同,參數列表相同(參數順序、個數、類型),方法返回值相同
3、訪問修飾符,訪問范圍需要大於等於父類的訪問范圍
4、與方法的參數名無關
區別點 重載方法 重寫方法
參數列表 必須修改 一定不能修改
返回類型 可以修改 一定不能修改
異常 可以修改 可以減少或刪除,一定不能拋出新的或者更廣的異常
訪問 可以修改 一定不能做更嚴格的限制(可以降低限制)
❿ C# 方法重載
方法1、3不屬於重載,是無法編譯通過的,首先你要理解什麼是一個方法的簽名,簽名是指方法的名稱和它參數的數量、類型、以及順序。注意這裡面不包括返回值的類型,也就是說,返回值的類型不是方法簽名的一部分。
再來看重載,重載是指方法名稱相同,但簽名不同的一組方法,通俗來說,就是參數不能完全一樣(數量、類型、順序),與返回值無關。
你的方法1和方法3僅僅是返回值不同,而方法名相同,參數的數量、類型、以及順序也完全相同,因此是具有同樣簽名的兩個方法,編譯器無法區分這兩個方法,所以在編譯時會報錯