日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java继承孙子类_Java:类与继承

發布時間:2023/12/10 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java继承孙子类_Java:类与继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java:類與繼承

對于面向對象的程序設計語言來說,類毫無疑問是其最重要的基礎。抽象、封裝、繼承、多態 這四大特性都離不開類,只有存在類,才能體現面向對象編程的特點,今天我們就來了解一些類與繼承的相關知識。首先,我們講述一下與類的初始化相關的東西, 然后再從幾個方面闡述繼承這一大特性。以下是本文的目錄大綱:

一.你了解類嗎?

二.你了解繼承嗎?

三.常見的面試筆試題

若有不正之處,請多多諒解并歡迎批評指正。

請尊重作者勞動成果,轉載請標明原文鏈接:

一.你了解類嗎?

在Java中,類文件是以.java為后綴的代碼文件,在每個類文件中最多只允許出現一 個public類,當有public類的時候,類文件的名稱必須和public類的名稱相同,若不存在public,則類文件的名稱可以為任意的名稱(當 然以數字開頭的名稱是不允許的)。

在類內部,對于成員變量,如果在定義的時候沒有進行顯示的賦值初始化,則Java會保證類的每個成員變量都得到恰當的初始化:

1)對于? char、short、byte、int、long、float、double等基本數據類型的變量來說會默認初始化為0(boolean變量默認會被初始化為false);

2)對于引用類型的變量,會默認初始化為null。

如果沒有顯示地定義構造器,則編譯器會自動創建一個無參構造器,但是要記住一點,如果顯示地定義了構造器,編譯器就不會自動添加構造器。注意,所有的構造器默認為static的。

下面我們著重講解一下 初始化 順序:

當程序執行時,需要生成某個類的對象,Java執行引擎會先檢查是否加載了這個類,如果沒有加載,則先執行類的加載再生成對象,如果已經加載,則直接生成對象。

在類的加載過程中,類的static成員變量會被初始化,另外,如果類中有static 語句塊,則會執行static語句塊。static成員變量和static語句塊的執行順序同代碼中的順序一致。記住,在Java中,類是按需加載,只有 當需要用到這個類的時候,才會加載這個類,并且只會加載一次。看下面這個例子就明白了:

運行這段代碼就會發現"Bread is loaded"只會被打印一次。

在生成對象的過程中,會先初始化對象的成員變量,然后再執行構造器。也就是說類中的變量會在任何方法(包括構造器)調用之前得到初始化,即使變量散步于方法定義之間。

輸出結果為:

bread

meal

二.你了解繼承嗎?

繼承是所有OOP語言不可缺少的部分,在java中使用extends關鍵字來表示繼承關系。當創建一個類時,總是在繼承,如果沒有明確指出要繼承的類,就總是隱式地從根類Object進行繼承。比如下面這段代碼:

類Man繼承于Person類,這樣一來的話,Person類稱為父類(基類),Man類稱為子類(導出類)。如果兩個類存在繼承關系,則子類 會自動繼承父類的方法和變量,在子類中可以調用父類的方法和變量。在java中,只允許單繼承,也就是說 一個類最多只能顯示地繼承于一個父類。但是一個類卻可以被多個類繼承,也就是說一個類可以擁有多個子類。

1.子類繼承父類的成員變量

當子類繼承了某個類之后,便可以使用父類中的成員變量,但是并不是完全繼承父類的所有成員變量。具體的原則如下:

1)能夠繼承父類的public和protected成員變量;不能夠繼承父類的private成員變量;

2)對于父類的包訪問權限成員變量,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;

3)對于子類可以繼承的父類成員變量,如果在子類中出現了同名稱的成員變量,則會發生隱藏現象,即子類的成員變量會屏蔽掉父類的同名成員變量。如果要在子類中訪問父類中同名成員變量,需要使用super關鍵字來進行引用。

2.子類繼承父類的方法

同樣地,子類也并不是完全繼承父類的所有方法。

1)能夠繼承父類的public和protected成員方法;不能夠繼承父類的private成員方法;

2)對于父類的包訪問權限成員方法,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;

3)對于子類可以繼承的父類成員方法,如果在子類中出現了同名稱的成員方法,則稱為覆蓋,即子類的成員方法會覆蓋掉父類的同名成員方法。如果要在子類中訪問父類中同名成員方法,需要使用super關鍵字來進行引用。

注意:隱藏和覆蓋是不同的。隱藏是針對成員變量和靜態方法的,而覆蓋是針對普通方法的。(后面會講到)

3.構造器

子類是不能夠繼承父類的構造器,但是要注意的是,如果父類的構造器都是帶有參數的,則必須在子類的構造器中顯示地通過super關鍵字調用父類 的構造器并配以適當的參數列表。如果父類有無參構造器,則在子類的構造器中用super關鍵字調用父類構造器不是必須的,如果沒有使用super關鍵字, 系統會自動調用父類的無參構造器。看下面這個例子就清楚了:

這樣的代碼是沒有問題的,如果把父類的無參構造器去掉,則下面的代碼必然會出錯:

改成下面這樣就行了:

4.super

super主要有兩種用法:

1)super.成員變量/super.成員方法;

2)super(parameter1,parameter2....)

第一種用法主要用來在子類中調用父類的同名成員變量或者方法;第二種主要用在子類的構造器中顯示地調用父類的構造器,要注意的是,如果是用在子類構造器中,則必須是子類構造器的第一個語句。

三.常見的面試筆試題

1.下面這段代碼的輸出結果是什么?

shape draw constructor

shape constructor

circle draw constructor

circle constructor

這道題目主要考察的是類繼承時構造器的調用順序和初始化順序。要記住一點:父類的構造器調用以及初始化過程一定在子類的前面。由于Circle類的父類是Shape類,所以Shape類先進行初始化,然后再執行Shape類的構造器。接著才是對子類Circle進行初始化,最后執行Circle的構造器。

2.下面這段代碼的輸出結果是什么?

shape constructor

circle constructor

shape

thisis circle

shape

這道題主要考察了隱藏和覆蓋的區別(當然也和多態相關,在后續博文中會繼續講到)。

覆蓋只針對非靜態方法(終態方法不能被繼承,所以就存在覆蓋一說了),而隱藏是針對成員變量和靜態方法的。這2者之間的區別是:覆蓋受 RTTI(Runtime type ?identification)約束的,而隱藏卻不受該約束。也就是說只有覆蓋方法才會進行動態綁定,而隱藏是不會發生動態綁定的。在Java中,除了static方法和final方法,其他所有的方法都是動態綁定。因此,就會出現上面的輸出結果。

不能,因為子類繼承父類的時候,先運行父類構造函數;具體的說就是運行父類時就會先“調用”父類的構造函數,注意“調用”和繼承不是一個含義,實質上是“自動運行”。

繼承(extends)的含義其實是“擴展”,子類完全沒必要擴展父類的構造函數,因為反正每次調子類的時候都會“自動運行”它父類的構造函數,如果真的需要子類構造函數特殊的形式,子類直接修改或重載自己的構造函數就好了。

估計是你對“構造函數”的意義本身不理解,“調用”一個類有“繼承”和“組合(說白了new 一個類)”兩種方式,當你“調用”一個類的時候就會“自動運行”它的“構造函數”。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java继承孙子类_Java:类与继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。