『壹』 java中重寫方法中調用父類的屬性
哥們你看好了,我和你一樣也是初學者,你的問題,也是前幾天我的問題;
這玩意我在Java群裡面也問過,搞了十年Java的也說不出個123來還動用了什麼debug測試工具,當然這個玩意以後我們也會用到!
我告訴你步驟怎麼回事:
當你newY的時候,注意,還沒有產生對象的時候,就執行了一個動作就是載入CLASS文件這個動作!
class文件已載入,就開始動用分配內存的動作,懂??
3.此時分配的對象有,方法區,父類方法,和子類方法:(這里說的覆蓋其實只是就近原則而已,其實沒有覆蓋如果你不理解,你可以看看Java內存分析)
4.還分配了成員變數,在堆裡面分配,注意:(堆內存,分配了子類和父類變數其實都有的,是劃分開的切記:兩個類裡面的i都給劃分了空間)
5.此時堆內存的所有變數,都是默認值,int就是0;這個步驟稱為:隱式初始化!以上是載入class後就發生的動作懂了?
6.然後子類繼承了父類,父類動作必然先執行父類裡面的構造函數,開始執行初始化動作
(注意:構造函數是用來初始化動作的,能給本類對象初始化,也能給子類對象初始化切記!)
7.父類,啟用構造函數先把自己的i=2給賦值完畢(顯示初始化動作);
就開始執行構造函數裡面的其他語句;這里就是你寫的那個方法display();
父類讀這個方法的時候,回去方法區裡面找方法,他優先找子類,如果子類沒有,在找他自己的,此刻子類是有的,也稱之為覆蓋
(說明一下,其實父類方法也在的)
8.此刻調用的子類方法,子類裡面調用了i,(此時父類的i已經是2了,但是子類i還是0,懂了?但是方法找變數的時候會優先找子類懂了?當然k也是0了)
9.父類讀完你這個調用以後就會把子類所有的成員變數初始化完成,稱之為(顯示初始化動作,就是我們能看的見的數字)
10.如果你在new完成以後,你在調用,你會發現,都是有值的了!
11.補充下:哥們純手工靠記憶敲打出來的;
這個是我個人糾結了好幾天以後總結的,總結的不到位還請指點,有大佬指引我,遇見這問題可以先記起來,以後學到多線程,很容易就可以理解!
祝你Java越來越厲害,順便也期望我也一樣吧,呵呵!!
『貳』 Java 父類A有屬性B b,子類A1有屬性B1 b,B1是B的子類。那麼A1的b屬性覆蓋了父類的屬性嗎
不會覆蓋的
A1中的b變數是局部變數,好比這是兩個家庭,恰好有一個孩子名字相同,但本質上是兩個不同的變數。
所以對A1中的b操作不會對父類A中的b屬性有任何影響
『叄』 java中的覆蓋是什麼意思,誰能寫個簡單的代碼 舉例解釋下
你可以理解為父類是一個模板,子類拿過來之後在上面修改。
舉個通俗的例子,盜墓筆記里張起靈家族手指都長,都長生不老。然後呢:
父親姓張,那麼他的前五個孩子都姓張,但是呢,第六個孩子跟媽媽姓王了,但是他們都繼承了父類手指長,長生不老的特性。老六就是覆蓋了父類中的張姓。
為啥寫父類還要覆蓋?
寫父類是因為很多子類都有一些通用的屬性,覆蓋是因為每一個子類還有些不同之處。
比如鳥類:通用的屬性是羽毛,會飛,兩只腿,下蛋。
但是鴕鳥這個類比較特殊,它繼承了鳥類但是不會飛,所以就覆蓋父類的方法,把飛行這項重新寫一下。
不知道你明白了沒。我是這么理解的。如果有不對的地方還請見諒。
『肆』 Java中屬性的隱藏與方法的覆蓋的區別
成員變數是沒法繼承的,而方法可以繼承。
首先a對象是animal類的對象,所以兩個變數的輸出的是animal類的成員變數。其中a.a,調用的靜態方法所以a.a和animal.a是一樣的。而且animal.a更為標准。
再看方法。由於method類是靜態方法,所以a.method就是animal.method;而voice方法在cat類中被覆寫,所以調用cat類中的方法,如果要訪問父類animal的voice方法應該用super關鍵字調用。
『伍』 在java中有沒有屬性覆蓋這一說法
好像沒有,但是有作用域啊!!!比如:
class Test{
int num = 0;
public void display(){
int num = 9;
System.out.println(num);
}
}
你調用display()的結果就是列印「9」。。。
『陸』 Java繼承中屬性的覆蓋的疑問
((Stemb)stb).x覆蓋掉了父類Rootb 的x值,但是結果正確阿,看你的代碼:
Rootb stb = new Stemb(47); \\聲明一個Rootb對象,對象的x值為1
System.out.println (stb.x);
System.out.println (((Stemb)stb).x); \\這里首先進行轉化,由於stb開始是Rootb對象,而Stemb繼承了Rootb對象,所以這里沒有問題,stb轉換為Stemb類對象的時候,x值跟著變成了Stemb對象的x值,沒有問題吧??
對於你的第二個問題:這要看具體情況,生成Rootb類的對象,對應x值就為1
生成Stemb對象,對應x值就為2
『柒』 JAVA構造器屬性覆蓋
public A()
{
int foo = 0;
}
這里,如果加了int那麼foo就是局部變數,去除int則就是全局變數。newA().foo取的是全局變數
『捌』 java中可以用哪個關鍵詞來查看父類被隱藏或覆蓋的屬性
屬性的隱藏是指實例變數和方法內部變數相同時,實例變數在該方法內會被隱藏,比如你在方法內直接輸出變數,前面不加this,那麼只會輸出方法內那個變數的值。
方法的覆蓋是指子類繼承父類時,對父類的方法進行重寫,要求返回類型,參數都要與父類一致,當然返回類型可以返回原來返回類型的子類。
一個是對變數而言一個是對方法而言,對於變數,你在方法內可以是任何的類型,和實例變數的類型沒有關系。
小弟不才,學java一段時間了,從來沒有看到過屬性的隱藏會出現在繼承中。在繼承時,子類中出現與父類相同的屬性時,那個屬性和父類中的屬性沒有關系,如果父類中的屬性可以被子類繼承,子類自然繼承了那個屬性,出現屬性名字相同時,那隻是只類的一個自己的屬性而已。在子類中用super當然能區別是那個屬性,這沒有什麼奇怪的,繼承的一個特點而已。
除了靜態變數外,你要訪問屬性得要有實例對象,你在一個類中同時初始化父類對象和子類對象,他們互不影響,除非你用多態的方式調用,就算用多態調用,使用的屬性也只會是父類的屬性!調用的方法則是子類重寫的方法!
『玖』 java繼承中關於屬性的覆蓋問題,繼承中是否存在屬性的覆蓋
屬性是不會覆蓋的哦。。。
父類的屬性是父類的。。。子類的屬性是子類的。。。
方法是可以被覆蓋的。。。
希望能幫到你。。。。
『拾』 java當子類覆蓋了父類的方法或屬性,子類是否繼承了父類的該方法或屬性
當然會繼承啊,如果想要調用的話用super就可以了
public
class
Father{
String
name
=
"Father";
public
void
print(){
System.out.println(this.name);
}
}
public
class
Child
extends
Father{
String
name
=
"Child";
public
void
print(){
System.out.println(this.name);
}
}
public
class
Main{
public
static
void
main(String[]
args){
Parent
p
=
new
Parent();
p.print();
//輸出Father
p
=
new
Child();
p.print();
//輸出Child
}
}