① 子類繼承父類怎麼在父類的方法中訪問子類的變數
這是「動態綁定」,動態綁定是指在執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
而想實現「動態綁定」,必須有繼承、重寫且父類引用指向子類對象,滿足了這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中「動態綁定機制」的好處。
② 父訪問子 和 父傳子 就是 props 和ref 分別有什麼區別
REF是Reference的縮寫,為參考尺寸的意思。
參考尺寸依ASME Y14.5上的定義是:在別處已有標示的尺寸,為了看圖人的方便,在其他位置重復標示的尺寸。可以由現有尺寸計算出來的尺寸,但也是為了看圖人的方便,而標示的尺寸。參考尺寸是不可量測的。
③ c++父類訪問子類保護成員 wtl,stl
就像它報的錯誤那樣,類的實例不能訪問類的protected成員函數,
T* pT = static_cast<T*>(this); 把this指針強制轉換,
轉成D1類指針時,由於D1中沒有定義PrintClassName,所以用基類的那個,相當於用回了this指針,類內訪問自身的protected是合法的;
轉成D2類指針時,此時是D2類外用D2的指針訪問D2的protected成員,這是不允許滴
④ WordPress中頁面屬性「父級」是干什麼的求詳解!!!
父頁面就相當於一個大的標題,下面有子標題,形成一個下拉那種,雖然內容各自不同,但是你打開子頁面的時候,網站連接會顯示在父頁面的下面
⑤ C++如何用父類訪問子類函數呢
所謂繼承,就是指子類「是一種」基類。所以子類一定會具備基類的所有特徵。
子類無法訪問基類的私有成員,所以必須調用父類的構造函數來初始化父類的成員。
對於子類來說,它不是「不會調用父類的構造函數」,而是「隠藏」了它。必要時候,你還是可以用特殊方法顯式調用的。
為了達到你的目的,你有兩個選擇:
一,為基類提供一個怠工(mmy)構造函數,不作為。
二,聲明為虛函數。
BTW,構造函數唯一的目的在於初始化對象。獲取資源而不初始化,有悖RAII原則。所以基本上,第一種情況不大可能出現。
⑥ Java中,「子類訪問父類的方法」與「子類調用父類的方法」訪問和調用區別是什麼
其實訪問和調用沒區別,不過對方法一般是說調用,對成員變數說訪問
⑦ 子類可以訪問父類的保護成員,這個訪問是怎麼訪問的
你說的沒錯,但注意是子類的內部可是調用父類的protected成員,不是在別的包new一個子類,再去調用
代碼?
⑧ java子類中如何訪問和修改父類成員
根據父類成員的訪問許可權修飾詞分為兩種情況:
①父類成員域由private修飾,那麼在子類中不能直接訪問父類成員域,但是可以通過父類中的公共方法訪問以及修改父類成員域。如:
class FatherClass{
private int a;
public int geta(){ return a;}
public void seta(int a){this.a=a;}
}
則在子類中可以通過geta獲得父類的成員域的值,通過seta修改父類成員域的值
②父類成員由public或protected或default(不寫訪問許可權修飾詞),在子類中可以直接訪問父類成員域,可以修改繼承的父類成員域,但是不能直接修改父類本身的成員域(可以通過上面所說的public void seta(int a){this.a=a;}對父類本身的成員域進行修改),以下是示例代碼:
父類本身的a與子類從父類繼承的a占據兩個不同的獨立的存儲空間,在繼承之後,他們的值互不相干(繼承的時候進行值傳遞),這樣可以避免因為子類中的操作而導致對父類的a的值進行預期結果之外的修改