您好,登錄后才能下訂單哦!
小編給大家分享一下Java中重寫和覆蓋怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
關于類的重寫和覆蓋,我們很容易把他們搞混淆,在Java中jvm會自動幫我們處理這樣的問題,但是在c#中咱們也有相關的關鍵字和處理方式,我們先來研究一下繼承關系中構造函數和方法的執行順序問題。
下面我們來個簡單的代碼
class A
{
public A()
{
Console.WriteLine("這是a構造函數");
}
public void a()
{
Console.WriteLine("這是a方法");
}
}
class B : A
{
public B()
{
Console.WriteLine("這是b構造函數");
}
public void b()
{
Console.WriteLine("這是b方法");
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("創建父級===============================================");
A a = new A();
Console.WriteLine("創建子級===============================================");
B b = new B();
Console.WriteLine("父級開始調用a方法======================================");
a.a();
Console.WriteLine("子級開始調用b方法======================================");
b.b();
Console.WriteLine("創建一個像父級的子級===================================");
A a1 = new B();
a1.a();
Console.Read();
}
}
輸出如下
創建父級===============================================這是a構造函數創建子級===============================================這是a構造函數這是b構造函數父級開始調用a方法======================================這是a方法子級開始調用b方法======================================這是b方法創建一個像父級的子級===================================這是a構造函數這是b構造函數這是a方法
我們可以從上面的返回可以知道,在繼承關系中,先執行父級的構造函數,然后是子級構造函數,然后再調用方法。
當然這里注意的是,需要一個父類可以給一個子類或者父類實例,但是反過來不可以,這個是我們后面學的多態,或者可以說是里氏代換原則。
覆蓋簡單的來說就是子類繼承父類,同時也繼承了不為私有的成員,如果說子類有一個與父類同方法簽名的方法,且沒有被重寫,那么我們在調用這個方法的時候由于父類的方法優先于子類的方法,子類被父類覆蓋。
下面我們來看一段代碼
class A
{
public void a()
{
Console.WriteLine("這是父級a方法");
}
}
class B : A
{
public void a()
{
Console.WriteLine("這是子級a方法");
}
}
class Program
{
static void Main(string[] args)
{
A a = new B();
a.a();
Console.Read();
}
}
這是父級a方法
此時我們看到調用子類的方法時,被父類覆蓋了,調用了父級的方法。
這里我們值得注意的是編譯器已經出現了一處警告
那么在c#中,new關鍵字的另一種用法就是消除覆蓋的警告
class B : A{ public new void a(){ Console.WriteLine("這是子級a方法"); }}
雖然我們加上這個new并沒有改變執行結果,畢竟我們要達到“0 error,0 warning”
那么有些時候,我父級的一個方法就是為了給子類擴展自己這個方法的特別之處,比如鳥類有翅膀,子類的燕子既有翅膀還飛得賊快,子類鴕鳥雖然有翅膀但它不能飛。別人就說所有的鳥都能飛,那么我給一個鴕鳥給他是不是證明了他說的是錯誤的。
只要能用到父級的地方,我們都能夠用他的子類來代替,因為子類包括父類的特征,這個就是我們面向對象原則里面的里氏代換原則。有些時候父級的一些方法不能實現我們想要的效果,那么我們就重寫這個父類的這個方法。
重寫也是在父子繼承關系中存在的,重寫父級的方法用關鍵字virtual標記父級的方法,表示這個方法是一個虛方法(有些地方叫虛函數,都差不多),在子級用override重寫父級標記的方法,這兩個關鍵字是一起使用的。如果父級virtual標記了但是子級沒有使用override重寫,那是沒有效果的,下面看代碼:
class A{ public virtual void a() { Console.WriteLine("這是父級a方法"); }}class B : A{ public override void a() { Console.WriteLine("這是重寫父級a方法"); }}class Program{ static void Main(string[] args) { A a = new B(); a.a(); }}
這是重寫父級a方法
我們區分重寫和覆蓋,它真的非常重要,重寫是面向對象中一個非常重要的基礎。
總結:
覆蓋:使用父類創建子類,由于父類的方法先執行,所有子類的方法被覆蓋,使用關鍵字new來消除編譯器的警告。
重寫:父類的方法需要用virtual標記為虛方法,子類使用override重寫父類的虛方法。使用父類對象創建一個子類對象代替,子類方法重寫父類方法,每個子類都不一樣,我們要靈活使用
以上是“Java中重寫和覆蓋怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。