當前位置:首頁 » 密碼管理 » java父類訪問子類變數

java父類訪問子類變數

發布時間: 2023-03-08 01:12:35

java繼承之後父類構造函數訪問子類變數的問題

這個。。。是編譯錯誤吧?
翻譯過來也不是超類型調用之前無法引用s
而是在調用構造函數時,不能訪問s
我的理解是這樣,s沒有加static的修飾符,他就是一個實例變數,要先有實例才能使用的變數。實例是構造函數執行完之後才產生的。
而加上static之後就不會報錯,原因是static是類變數,不需要實例就可以使用。
這是我的看法,你要是有什麼不同意見可以說出來一起討論討論。。。

⑵ java父類調用子類變數

子類重寫父類的方法只要滿足幾個條件,方法名相同,修飾符和返回值范圍不比父類小即可。與方法體沒有任何關系

⑶ java 如何調用父類的父類中的成員變數

如果成員變數是protected或public的,那麼對子類可見,直接使用變數名就可以訪問子類中繼承的該變數。如果成員變數是private的,那麼只能通過父類提供的getter和setter去訪問。

⑷ 子類繼承父類怎麼在父類的方法中訪問子類的變數

這是「動態綁定」,動態綁定是指在執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
而想實現「動態綁定」,必須有繼承、重寫且父類引用指向子類對象,滿足了這3條就屬於「動態綁定」,而它的好處就是像你說的那樣,父類引用訪問的是子類對象的方法,你看下邊的例子吧:

publicclassA
{
publicstaticvoidmain(Stringargs[])
{
Aa=newB();
print(ainstanceofA);
print(ainstanceofB);
a.sayHello();
a=newC();
print(ainstanceofA);
print(ainstanceofC);
a.sayHello();
}
voidsayHello()
{
print("Hello!");
}
publicstaticvoidprint(Objectobj)
{
System.out.println(obj);
}
publicstaticvoidprint()
{
System.out.println();
}
}
classBextendsA
{
voidsayHello()
{
print("Hello,I'mB!");
}
}
classCextendsA
{
voidsayHello()
{
print("Hello,I'mC!");
}
}


它的輸出結果是:
而不是輸出的「Hello」,從輸出的2個true可以看出這里採用的就是「父類引用指向子類對象」,你先別問為什麼輸出的不是「Hello」,其實實際情況也正是我們希望輸出「Hello,I'm B」要好一些,因為我們new的是A類的子類B和C,雖然它們2個都可以直接採用a.sayHello來調用,但如果輸出2個「Hello」,那跟我們直接new一個A類的對象沒什麼區別。如果我們要想不管A有多少子類,都採用a.sayHello來調用(好記、易寫、易改),且java沒有「動態綁定機制」,那麼父類A的sayHello方法可就不好寫了,得先判斷是哪個子類,再調用相關子類的sayHello方法,這跟不採用繼承,直接new個B和C的對象,再採用b.sayHello、c.sayHello沒什麼2樣,那麼這里的「繼承」將毫無意義,而且如果日後你你還需要加一個子類D,你還需要new個D的對象,再採用d.sayHello。


順便,這里你應該還看到了我的父類A還自定義了一個print方法,它的參數既不是String也不是int、double,而是String類、int的包裝類、double的包裝類等類的父類對象Object類,所以我的sayHello方法里給print函數傳遞的是String類(父類Object的引用指向子類對象String類),而main方法里的print(a instanceof A)語句傳遞的是boolean的包裝類(父類Object的引用指向子類對象Boolean類),所以這2種調用也是用了「動態綁定」,如果不用呢?不是很多新手都希望java能像C那樣直接print("Hello World")多好,那麼如果不用「動態綁定」,光是8個基本類型你就需要重寫8個print函數,而且,System.out.println語句傳遞的參數個數也是不確定的(盡管最後都連接成1個String參數),你不用「動態綁定」如何重寫?你寫不出來!


再舉個例子,如果你寫了一個小游戲,幾十中坦克都繼承於同一個父類:Tank類,然後,你想在游戲界面新建1個坦克,那你的main方法只需要統統採用類似於a.Draw()的語句去畫一個坦克即可(全用父類對象的引用),而不需要先判斷是哪個子類,再採用類似【case b:b.Draw();break;case c:c.Draw();break;……case n:n.Draw();break;】的語句(幾十、幾百個子類,你光判斷語句恐怕就幾百行了吧?),同樣開火、移動都只需要調用a.Fire()、a.up()、a.down()、a.Left()、a.Right()即可。而且,如果日後你再想新加1個叫Tank99的子類,那麼你的主方法里關於生成一輛Tank99坦克和Tank99的開火、移動等一系列語句都無需修改,你只需要寫一個Tank99類,繼承並重寫Tank父類的方法即可(你不採用「動態綁定」,那麼主方法里的一切相關方法全部都需要修改,忘了1個地方,程序就出錯了)。程序的可擴展性和健壯性很好,這就是java中「動態綁定機制」的好處。

⑸ java父類怎麼訪問子類數據成員

後面的問題沒太明白……-----------------------存在繼承關系是可以調用的,子類會繼承父類的所有方法,除了構造方法,所以是可以的,屬性也是可以的,只要用子類的實例對象去『。』父類的屬性或方法就可以了,但是,父類受私有的方法是調用不到的……舉個例子吧(借的一個例子,改了點): class Animal { // 父類
public int i = 100; // 屬性,也就是成員變數

public void run() {
System.out.println("動物跑");
}
}

class Dog extends Animal { // 子類
@Override
public void run() {// 子類重寫父類的方法run
System.out.println("Dog四條腿跑");
}
}

public class Test {
public static void main(String[] args) {
// 調用父類屬性a
System.out.println(new Animal().i);
// 調用子類方法run
new Dog().run();//這是因為子類重寫了父類方法,所以調用的是自己的(這就是一個多態的體現)
}
}其中趣味你慢慢體會吧,最好自己練練!!!

⑹ java以父類的變數訪問子類的成員

class Parent{
public void eat(){ 語句塊; }
}

class Child{
public void eat(){ 語句塊; }
public void sing(){ 語句塊; }
}

public class Test{
public static void main(String[] args){
Parent p = new Child();
p.eat(); //這種調用時正確的,因為父類中有eat()方法,並且執行的是子類的中eat()方法
// p.sing(); 這種調用時錯誤的,因為父類中根本就沒有sing()方法,它是子類中的新方法
}
}

熱點內容
搭建伺服器創建小程序 發布:2025-05-20 15:34:40 瀏覽:622
精通腳本 發布:2025-05-20 14:42:56 瀏覽:385
東方財富經典版如何更改密碼 發布:2025-05-20 14:42:43 瀏覽:944
砸口紅解壓 發布:2025-05-20 14:41:02 瀏覽:511
配置sp失敗怎麼辦 發布:2025-05-20 14:35:08 瀏覽:179
java學到什麼程度 發布:2025-05-20 14:31:54 瀏覽:480
壓縮誤差分析 發布:2025-05-20 14:27:53 瀏覽:98
每秒上億次訪問伺服器怎麼處理 發布:2025-05-20 14:10:07 瀏覽:315
按鍵精靈資料庫操作 發布:2025-05-20 14:08:33 瀏覽:593
360瀏覽器無法訪問網路 發布:2025-05-20 14:05:13 瀏覽:835