父類訪問子類變數
後面的問題沒太明白……-----------------------存在繼承關系是可以調用的,子類會繼承父類的所有方法,除了構造方法,所以是可以的,屬性也是可以的,只要用子類的實例對象去『。』父類的屬性或方法就可以了,但是,父類受私有的方法是調用不到的……舉個例子吧(借的一個例子,改了點): 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();//這是因為子類重寫了父類方法,所以調用的是自己的(這就是一個多態的體現)
}
}其中趣味你慢慢體會吧,最好自己練練!!!
『貳』 C#中父類可以訪問子類成員變數嗎
只有public
private是自己可以訪問
protected是該類的子類可以訪問。
『叄』 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()方法,它是子類中的新方法
}
}
『肆』 php父類如何調用子類的靜態方法或變數
php父類中怎麼調用子類的的靜態屬性了,Oh,my god,如果被面試官問道這種問題,你一定會說shit,fucky question。你會說我很少這么做,況且php對於靜態的操作太隨意了,php在父類調用子類的靜態屬性是一件麻煩的事情。我們知道子類中調用父類的靜態屬性,可以用self::的形式。但是父類調用子類如果用self::就只能調用到父類的靜態屬性。那麼,怎麼辦了?php是不是無法做到了?答案當然是否定的,php中還可以使用在父類中用子類的類名來調用的方法。
不過,這當中仍然存在一個問題,就是如果我有多個類繼承了同一個父類,而且父類的某個函數要用到各個子類的靜態屬性的話,就想當trouble了。這里有個php的朋友提供了一種思路,採用在子類中重載父類的方法使父類得到靜態屬性。父類中使用了get_class函數得到類名,get_class()是父類名,get_class($this)是子類名。好了得到這個再用eval函數做下執行語句就OK啦。例子:
//父類class A {
public function __con(){
//這里主要為讓大家看清楚,所以列印出來類名,供大家學習
echo(get_class($this)).'/';
echo(get_class()).'/';
eval(\$ab = . get_class($this) . ::\$table;);echo $ab;}}//子類Bclass B extends A {
static $table = 'b table';
function __construct(){
$this-__con();}}//子類Cclass C extends A{
static $table = 'c table';
function cc(){
$this-__con();}}//調用
new B; //輸出結果 B A b table
$c = new C;
上面就是php父類調用子類靜態成員的方法,在子類重載父類的方法還是相當不錯的 ,當時聽朋友提起這個時,就異常激動。父類我們也叫做基類,或者底層類。一般都是最先設計,子類就是根據各個需要來設計,所以我們子類修改的可能性比較大,操作靈活性也比較大。
『伍』 java繼承之後父類構造函數訪問子類變數的問題
這個。。。是編譯錯誤吧?
翻譯過來也不是超類型調用之前無法引用s
而是在調用構造函數時,不能訪問s
我的理解是這樣,s沒有加static的修飾符,他就是一個實例變數,要先有實例才能使用的變數。實例是構造函數執行完之後才產生的。
而加上static之後就不會報錯,原因是static是類變數,不需要實例就可以使用。
這是我的看法,你要是有什麼不同意見可以說出來一起討論討論。。。
『陸』 子類從父類繼承過來的方法可以操作子類自己定義的成員變數嗎
一樓回答的不錯。如果我回答的話,這樣說,
1.首先當子類繼承了父類,因此子類(當繼承方式為public或protected時)可以訪問及改動父類的public成員,但訪問或改不了私有成員和不可訪問變數;
2.但父類沒繼承子類,所以父類沒有權利訪問(操作)子類的成員變數;
但是你的你想用父類的函數來訪問(操作)子類成員的話,可以在子類再定義一個父類的同樣一個函數,用虛函數;然後用父類指針指向子類對象,來解決你的問題。這個後面再學的學的知識,現在暫時可以認為「不能操作子類自己定義的成員變數」。
『柒』 子類繼承父類怎麼在父類的方法中訪問子類的變數
這是「動態綁定」,動態綁定是指在執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
而想實現「動態綁定」,必須有繼承、重寫且父類引用指向子類對象,滿足了這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中「動態綁定機制」的好處。
『捌』 C#中父類可以訪問子類成員變數嗎
父類可以訪問,public,protected(貌似你這個單詞寫錯了)但是父類也將private成員繼承過來,卻不可以訪問。。。。
『玖』 java父類調用子類變數
子類重寫父類的方法只要滿足幾個條件,方法名相同,修飾符和返回值范圍不比父類小即可。與方法體沒有任何關系