牛客3(1 介面的實現2 子類的初始化)

2021-10-12 09:39:17 字數 1673 閱讀 7246

題目:如果乙個介面cup有個方法use(),有個類smallcup實現介面cup,則在類smallcup中正確的是()

a.void use()

b.protected void use()

c.public void use()

d.以上語句都可以用在類smallcup中

答案:c

解析:既然是實現介面,就要實現介面的所有方法,相當於重寫所有的方法,並且需要滿足:三同一大一小(方法名,返回值型別,形參相同;訪問許可權》=重寫前,丟擲異常<=重寫前)

首先明確:

介面中的方法都是隱式抽象的,會被隱式指定為public abstract (只能是public abstract的,其他修飾符都會報錯)。介面中的方法是不能在介面中實現的,只能在實現介面的類匯中來實現介面中的方法。

介面中的變數會被隱式指定為public static fianl

介面中每乙個方法也是隱式抽象的,宣告時同樣不需要abstract關鍵字。

重寫介面中的方法,訪問許可權一定是public

題目二:下面的**輸出是什麼?

public

class

base

public

void

callname()

static

class

subextends

base

}public

static

void

main

(string[

] args)

}

答案:a

解析:new sub()**在創造派生類的過程中首先建立基類物件,然後才能建立派生類。**建立基類即預設呼叫base()方法,在方法中呼叫callname()方法,由於派生類中存在此方法,則被呼叫的callname()方法是派生類中的方法,此時派生類還未構造,所以basename的值為null。

補充下類的載入順序:

父類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)

子類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)

父類非靜態**塊(包括費靜態初始化塊,非靜態屬性)

父類建構函式

子類非靜態**塊(包括非靜態初始化塊,非靜態屬性)

子類建構函式

其中:類中靜態塊按照宣告順序執行,並且1,2不需要呼叫new類例項的時候就執行了(意思就是在類載入到方法區的時候執行的)。其次,需要理解子類覆蓋父類方法的問題,也就是方法重寫實現多型的問題。

base b = new sub();是多型的一種表現形式,宣告是base,實現是sub類(這裡不要忘了,編譯看左邊,執行看右邊),理解為b編譯時變現為base類特性,執行時表現為sub』類特性。當子類覆蓋了父類的方法後,父類的方法已經被重寫,題目中 父類初始化呼叫的方法為子類實現的方法,子類實現的 方法中呼叫的basename為子類中的私有屬性。

這個程式只執行到了步驟4,子類非靜態**塊和初始化步驟還沒有到,子類中的basename還沒有被初始化,所以此時basename為空,即null。

執行方法時,由於多型表現為子類特性(執行看右邊),所以會先在子類看是否有callname()方法,而此時子類未被初始化-null(執行完父類構造器後才會開始執行子類)。

物件導向 8 介面與介面的實現

二 介面的作用?三 介面的相關語法 四 介面的向上造型 總結 1 介面的語法 2 什麼情況下用介面?3 介面的好處 本篇文章主要講解介面的語法,什麼情況下用介面?讀者如果發現有什麼理解錯的地方指正一下,我會第一時間來改正並重新學習,謝謝大家 1 是一種資料型別 引用資料型別 2 由inte ce定義...

php 30 介面的實現和繼承

inte ce user inte ce demo 使用implements來實現乙個介面 乙個類可以實現多個介面。只要使用逗號 將多個介面鏈結起來就可以。class person class person implements user demo function setname name fun...

物件導向16 介面的定義與實現

package com.oop.demo09 inte ce 定義的關鍵字 介面都需要有實現類 public inte ce userservice package com.oop.demo09 public inte ce timeservice package com.oop.demo09 抽象...