① java中如何取到一個對象的所有屬性值,並且在創建一個相同的對象
利用Java的反射機制,或者是簡單點的,重寫被復制類的clone()方法,即可。看圖:
② C#中如何重寫ToString()方法輸出類中的變數
C#中,重寫使用override修飾符。
要擴展或修改繼承的方法、屬性、索引器或事件的抽象實現或虛實現,必須使用override修飾符。
示例:
publicclassEmployee
{
publicstringname;
publicoverridestringToString()
{
//重寫需要的輸出。
returnyoucode;
}
}
override方法提供從基類繼承的成員的新實現。由override聲明重寫的方法稱為重寫基方法。重寫的基方法必須與override方法具有相同的簽名。
不能重寫非虛方法或靜態方法。重寫的基方法必須是virtual、abstract或override的。
override聲明不能更改virtual方法的可訪問性。override方法和virtual方法必須具有相同的訪問級別修飾符。
您不能使用new、static或virtual修飾符來修改override方法。
重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,並且被重寫的屬性必須是virtual、abstract或override的。
參考MSDN
③ 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類的抽象類 子類重寫方法輸出結果
1.抽象類
public abstract class IBotany {
private int bloodVolume=100;
private String botanyName="默認植物";
public abstract void attack();
public int getBloodVolume() {
return bloodVolume;
}
public void setBloodVolume(int bloodVolume) {
this.bloodVolume = bloodVolume;
}
public String getBotanyName() {
return botanyName;
}
public void setBotanyName(String botanyName) {
this.botanyName = botanyName;
}
}
2.豆莢類
public class PeaPods extends IBotany{
public PeaPods(){
super();
}
public PeaPods(int bloodVolume,String botanyName){
setBloodVolume(bloodVolume);
setBotanyName(botanyName);
}
public void attack() {
System.out.println(getBotanyName()+"植物可以遠程攻擊!剩餘血量:"+getBloodVolume());
}
}
3.土豆類
public class Potato extends IBotany{
public Potato(){
super();
}
public Potato(int bloodVolume,String botanyName){
setBloodVolume(bloodVolume);
setBotanyName(botanyName);
}
public void attack() {
System.out.println(getBotanyName()+"植物可以近身肉搏!剩餘血量:"+getBloodVolume());
}
}
4.測試類
public static void main(String[] args) {
PeaPods peaPods = new PeaPods(50, "豌豆莢");
Potato potato = new Potato(500, "土豆");
peaPods.attack();
potato.attack();
}
輸入結果:
豌豆莢植物可以遠程攻擊!剩餘血量:50
土豆植物可以近身肉搏!剩餘血量:500
⑤ 為何java中,在子類調用父類繼承來的方法時,輸出的是父類的屬性值。
兩個屬性都是私有的,子類不能繼承父類私有屬性或方法,但父類自己卻可以使用自己的私有屬性和方法,所以此處如果不重寫父類方法,則在調用show()方法時默認使用的是父類方法,調用的是父類屬性,所以輸出A中的i、j。但當子類覆蓋了,也即重寫了父類方法時,默認調用子類方法,所以輸出的是子類屬性,如果你不相信,你可以在重寫父類方法之後使用super調用重寫的方法,輸出的肯定是父類屬性,因為super是強制使用父類屬性和方法的意思,其實如果你能深入研究的話,你會發現super其實就是一個父類對象,在之心子類構造函數時jvm默認為我們創建好的。
這個地方你可以將兩個屬性換成公有的,但是有這么一句話你去體會——當子類覆蓋父類的成員變數時,父類方法使用的是父類的成員變數,子類方法使用的是子類的成員變數
⑥ Java 繼承 重寫方法 傳值
初始化順序的問題,b bb = new b(4);這句在執行的時候首先會調用父類的構造方法,然後就是調用test()方法,而子類是覆蓋了父類的test()方法的,所以是調用子類的test()方法,而在調用父類的構造方法是,子類k值還未確定,虛擬機會首先會把k初始化為零,所以開始輸出的是KKKKKKKk=0,然後調用子類的構造方法,而此時k值已經賦值為15,所以輸出的是KKKKKKKk=15
,我想大概就是這樣的
⑦ java中的方法重寫
理論上說方法重寫只要參數列表和名稱相同就可以認為已經是重寫~~不過方法重寫一般都和原來的方法一摸一樣~~也就是方法名、參數列表、返回值都和原方法一樣~~要實現方法重寫的話必須得繼承相應的父類~~並且在子類里有一個和父類的某一個方法相同的一個方法~~如果是在本類里存在的相同的方法是重載而不是重寫~~