日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2023/12/10 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java继承孙子类_Java:类与继承 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java:類(lèi)與繼承

對(duì)于面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言來(lái)說(shuō),類(lèi)毫無(wú)疑問(wèn)是其最重要的基礎(chǔ)。抽象、封裝、繼承、多態(tài) 這四大特性都離不開(kāi)類(lèi),只有存在類(lèi),才能體現(xiàn)面向?qū)ο缶幊痰奶攸c(diǎn),今天我們就來(lái)了解一些類(lèi)與繼承的相關(guān)知識(shí)。首先,我們講述一下與類(lèi)的初始化相關(guān)的東西, 然后再?gòu)膸讉€(gè)方面闡述繼承這一大特性。以下是本文的目錄大綱:

一.你了解類(lèi)嗎?

二.你了解繼承嗎?

三.常見(jiàn)的面試筆試題

若有不正之處,請(qǐng)多多諒解并歡迎批評(píng)指正。

請(qǐng)尊重作者勞動(dòng)成果,轉(zhuǎn)載請(qǐng)標(biāo)明原文鏈接:

一.你了解類(lèi)嗎?

在Java中,類(lèi)文件是以.java為后綴的代碼文件,在每個(gè)類(lèi)文件中最多只允許出現(xiàn)一 個(gè)public類(lèi),當(dāng)有public類(lèi)的時(shí)候,類(lèi)文件的名稱(chēng)必須和public類(lèi)的名稱(chēng)相同,若不存在public,則類(lèi)文件的名稱(chēng)可以為任意的名稱(chēng)(當(dāng) 然以數(shù)字開(kāi)頭的名稱(chēng)是不允許的)。

在類(lèi)內(nèi)部,對(duì)于成員變量,如果在定義的時(shí)候沒(méi)有進(jìn)行顯示的賦值初始化,則Java會(huì)保證類(lèi)的每個(gè)成員變量都得到恰當(dāng)?shù)某跏蓟?#xff1a;

1)對(duì)于? char、short、byte、int、long、float、double等基本數(shù)據(jù)類(lèi)型的變量來(lái)說(shuō)會(huì)默認(rèn)初始化為0(boolean變量默認(rèn)會(huì)被初始化為false);

2)對(duì)于引用類(lèi)型的變量,會(huì)默認(rèn)初始化為null。

如果沒(méi)有顯示地定義構(gòu)造器,則編譯器會(huì)自動(dòng)創(chuàng)建一個(gè)無(wú)參構(gòu)造器,但是要記住一點(diǎn),如果顯示地定義了構(gòu)造器,編譯器就不會(huì)自動(dòng)添加構(gòu)造器。注意,所有的構(gòu)造器默認(rèn)為static的。

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

當(dāng)程序執(zhí)行時(shí),需要生成某個(gè)類(lèi)的對(duì)象,Java執(zhí)行引擎會(huì)先檢查是否加載了這個(gè)類(lèi),如果沒(méi)有加載,則先執(zhí)行類(lèi)的加載再生成對(duì)象,如果已經(jīng)加載,則直接生成對(duì)象。

在類(lèi)的加載過(guò)程中,類(lèi)的static成員變量會(huì)被初始化,另外,如果類(lèi)中有static 語(yǔ)句塊,則會(huì)執(zhí)行static語(yǔ)句塊。static成員變量和static語(yǔ)句塊的執(zhí)行順序同代碼中的順序一致。記住,在Java中,類(lèi)是按需加載,只有 當(dāng)需要用到這個(gè)類(lèi)的時(shí)候,才會(huì)加載這個(gè)類(lèi),并且只會(huì)加載一次。看下面這個(gè)例子就明白了:

運(yùn)行這段代碼就會(huì)發(fā)現(xiàn)"Bread is loaded"只會(huì)被打印一次。

在生成對(duì)象的過(guò)程中,會(huì)先初始化對(duì)象的成員變量,然后再執(zhí)行構(gòu)造器。也就是說(shuō)類(lèi)中的變量會(huì)在任何方法(包括構(gòu)造器)調(diào)用之前得到初始化,即使變量散步于方法定義之間。

輸出結(jié)果為:

bread

meal

二.你了解繼承嗎?

繼承是所有OOP語(yǔ)言不可缺少的部分,在java中使用extends關(guān)鍵字來(lái)表示繼承關(guān)系。當(dāng)創(chuàng)建一個(gè)類(lèi)時(shí),總是在繼承,如果沒(méi)有明確指出要繼承的類(lèi),就總是隱式地從根類(lèi)Object進(jìn)行繼承。比如下面這段代碼:

類(lèi)Man繼承于Person類(lèi),這樣一來(lái)的話(huà),Person類(lèi)稱(chēng)為父類(lèi)(基類(lèi)),Man類(lèi)稱(chēng)為子類(lèi)(導(dǎo)出類(lèi))。如果兩個(gè)類(lèi)存在繼承關(guān)系,則子類(lèi) 會(huì)自動(dòng)繼承父類(lèi)的方法和變量,在子類(lèi)中可以調(diào)用父類(lèi)的方法和變量。在java中,只允許單繼承,也就是說(shuō) 一個(gè)類(lèi)最多只能顯示地繼承于一個(gè)父類(lèi)。但是一個(gè)類(lèi)卻可以被多個(gè)類(lèi)繼承,也就是說(shuō)一個(gè)類(lèi)可以擁有多個(gè)子類(lèi)。

1.子類(lèi)繼承父類(lèi)的成員變量

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

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

2)對(duì)于父類(lèi)的包訪(fǎng)問(wèn)權(quán)限成員變量,如果子類(lèi)和父類(lèi)在同一個(gè)包下,則子類(lèi)能夠繼承;否則,子類(lèi)不能夠繼承;

3)對(duì)于子類(lèi)可以繼承的父類(lèi)成員變量,如果在子類(lèi)中出現(xiàn)了同名稱(chēng)的成員變量,則會(huì)發(fā)生隱藏現(xiàn)象,即子類(lèi)的成員變量會(huì)屏蔽掉父類(lèi)的同名成員變量。如果要在子類(lèi)中訪(fǎng)問(wèn)父類(lèi)中同名成員變量,需要使用super關(guān)鍵字來(lái)進(jìn)行引用。

2.子類(lèi)繼承父類(lèi)的方法

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

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

2)對(duì)于父類(lèi)的包訪(fǎng)問(wèn)權(quán)限成員方法,如果子類(lèi)和父類(lèi)在同一個(gè)包下,則子類(lèi)能夠繼承;否則,子類(lèi)不能夠繼承;

3)對(duì)于子類(lèi)可以繼承的父類(lèi)成員方法,如果在子類(lèi)中出現(xiàn)了同名稱(chēng)的成員方法,則稱(chēng)為覆蓋,即子類(lèi)的成員方法會(huì)覆蓋掉父類(lèi)的同名成員方法。如果要在子類(lèi)中訪(fǎng)問(wèn)父類(lèi)中同名成員方法,需要使用super關(guān)鍵字來(lái)進(jìn)行引用。

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

3.構(gòu)造器

子類(lèi)是不能夠繼承父類(lèi)的構(gòu)造器,但是要注意的是,如果父類(lèi)的構(gòu)造器都是帶有參數(shù)的,則必須在子類(lèi)的構(gòu)造器中顯示地通過(guò)super關(guān)鍵字調(diào)用父類(lèi) 的構(gòu)造器并配以適當(dāng)?shù)膮?shù)列表。如果父類(lèi)有無(wú)參構(gòu)造器,則在子類(lèi)的構(gòu)造器中用super關(guān)鍵字調(diào)用父類(lèi)構(gòu)造器不是必須的,如果沒(méi)有使用super關(guān)鍵字, 系統(tǒng)會(huì)自動(dòng)調(diào)用父類(lèi)的無(wú)參構(gòu)造器??聪旅孢@個(gè)例子就清楚了:

這樣的代碼是沒(méi)有問(wèn)題的,如果把父類(lèi)的無(wú)參構(gòu)造器去掉,則下面的代碼必然會(huì)出錯(cuò):

改成下面這樣就行了:

4.super

super主要有兩種用法:

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

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

第一種用法主要用來(lái)在子類(lèi)中調(diào)用父類(lèi)的同名成員變量或者方法;第二種主要用在子類(lèi)的構(gòu)造器中顯示地調(diào)用父類(lèi)的構(gòu)造器,要注意的是,如果是用在子類(lèi)構(gòu)造器中,則必須是子類(lèi)構(gòu)造器的第一個(gè)語(yǔ)句。

三.常見(jiàn)的面試筆試題

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

shape draw constructor

shape constructor

circle draw constructor

circle constructor

這道題目主要考察的是類(lèi)繼承時(shí)構(gòu)造器的調(diào)用順序和初始化順序。要記住一點(diǎn):父類(lèi)的構(gòu)造器調(diào)用以及初始化過(guò)程一定在子類(lèi)的前面。由于Circle類(lèi)的父類(lèi)是Shape類(lèi),所以Shape類(lèi)先進(jìn)行初始化,然后再執(zhí)行Shape類(lèi)的構(gòu)造器。接著才是對(duì)子類(lèi)Circle進(jìn)行初始化,最后執(zhí)行Circle的構(gòu)造器。

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

shape constructor

circle constructor

shape

thisis circle

shape

這道題主要考察了隱藏和覆蓋的區(qū)別(當(dāng)然也和多態(tài)相關(guān),在后續(xù)博文中會(huì)繼續(xù)講到)。

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

不能,因?yàn)樽宇?lèi)繼承父類(lèi)的時(shí)候,先運(yùn)行父類(lèi)構(gòu)造函數(shù);具體的說(shuō)就是運(yùn)行父類(lèi)時(shí)就會(huì)先“調(diào)用”父類(lèi)的構(gòu)造函數(shù),注意“調(diào)用”和繼承不是一個(gè)含義,實(shí)質(zhì)上是“自動(dòng)運(yùn)行”。

繼承(extends)的含義其實(shí)是“擴(kuò)展”,子類(lèi)完全沒(méi)必要擴(kuò)展父類(lèi)的構(gòu)造函數(shù),因?yàn)榉凑看握{(diào)子類(lèi)的時(shí)候都會(huì)“自動(dòng)運(yùn)行”它父類(lèi)的構(gòu)造函數(shù),如果真的需要子類(lèi)構(gòu)造函數(shù)特殊的形式,子類(lèi)直接修改或重載自己的構(gòu)造函數(shù)就好了。

估計(jì)是你對(duì)“構(gòu)造函數(shù)”的意義本身不理解,“調(diào)用”一個(gè)類(lèi)有“繼承”和“組合(說(shuō)白了new 一個(gè)類(lèi))”兩種方式,當(dāng)你“調(diào)用”一個(gè)類(lèi)的時(shí)候就會(huì)“自動(dòng)運(yùn)行”它的“構(gòu)造函數(shù)”。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。