導航:首頁 > 編程語言 > java子類初始化

java子類初始化

發布時間:2022-05-18 10:33:45

㈠ 關於java中用子類初始化父類對象的問題

>>為什麼這里b2.x輸出的值是10呢???
答:Java中方法為動態綁定,但是屬性是靜態綁定的,也就是說雖然b2指向的是一個Sub類對象,但是由於屬性的靜態綁定原則,b2本身作為base類型的對象他的屬性x依然是base類中的x,這也可以說明:多態在面向對象中是針對方法而言的。

>>這和b2是base型有什麼關系,b2是base型在這里有什麼意義。
>>最好能舉個例子。
答:b2作為base類型的對象,在面向對象語言中,父類類型的引用是可以指向子類類型的對象的,因此b2是base類型的引用指向sub類型的對象。如:
Collection c = new ArrayList();
這里的c也是這種情況。

>>順便問一下溯造型是怎麼回事?
我學Java這么長時間沒聽說過"溯造型"的概念,也可能是叫法不同,但是在我想你說的應該是類型轉換的問題,在面向對象語言中子類對象可以直接轉換變成父類對象,如Collection c =new ArrayList(),同時父類對象也可以通過強制類型轉換變成父類對象,前提是父類對象的實際類型是子類對象,如:
Collection c1 = new ArrayList();
Collection c2 = new HashSet()
ArrayList a = (ArrayList)c1;//成功
ArrayList b = (ArrayList)c2;//失敗

>>最後一個問事關於「上溯造型」的。
答案同上個問題

㈡ Java子類構造函數初始化問題

剛剛想當然的回答了一個3,然後發現不妥,試了一下果然不對,就可恥的把回答刪除了,刪除後居然不能重新回答,果斷重新注冊個號回答

首先我們加上點東西

publicclassDemo10{
publicstaticvoidmain(String[]args){
newJoo();
}
}
classIoo{
inta=3;
publicIoo(){
System.out.println("Ioo構造方法執行");
System.out.println("Ioo中this類型為:"+this.getClass().getSimpleName());//查看this是什麼類型
this.t();

System.out.println("Ioo構造方法執行完畢");
}
publicvoidt(){
System.out.println("執行Ioo的t方法");
System.out.println(this.a);
System.out.println("Ioo中的t方法執行完畢");
}
}
classJooextendsIoo{
intb=3;
publicJoo(){
System.out.println("Joo構造方法執行完畢");
}
@Override
publicvoidt(){
System.out.println("執行Joo中的t方法");
System.out.println(this.b);
System.out.println("Joo中的t方法執行完畢");
}
}

輸出結果為:

-------------------------------------

Ioo構造方法執行

Ioo中this類型為:Joo

執行Joo中的t方法

0

Joo中的t方法執行完畢

Ioo構造方法執行完畢

Joo構造方法執行完畢

-------------------------------------

為什麼輸出的是0呢?又為什麼Ioo中this的類型會是Joo呢?

接下來我們反編譯一下class文件

classIoo{
inta;
publicIoo(){
a=3;
System.out.println("Ioo構造方法執行");
System.out.println("Ioo中this類型為:"+getClass().getSimpleName());
t();
System.out.println("Ioo構造方法執行完畢");
}

publicvoidt(){
System.out.println("執行Ioo的t方法");
System.out.println(a);
System.out.println("Ioo中的t方法執行完畢");
}
}
classJooextendsIoo{
intb;
publicJoo(){
b=3;
System.out.println("Joo構造方法執行完畢");
}

publicvoidt(){
System.out.println("執行Joo中的t方法");
System.out.println(b);
System.out.println("Joo中的t方法執行完畢");
}
}

我們可以看出,成員變數的賦值操作是放到了構造方法中執行的,我們根據控制台輸出語句的順序來模擬java的執行順序,由於我們實例化的是子類Joo,他會首先執行父類的構造方法,我們先來看執行順序

  1. a賦值為3

  2. 輸出"Ioo構造方法執行"

  3. 由於this代表當前對象,那麼既然是實例化Joo時調用的方法,this代表的就是Joo,故輸出Joo

  4. 執行t方法(由於class反編譯後,this.被簡化了,所以我們觀察源代碼,this.t(),既然this的類型是Joo,那麼this.t()執行的就是Joo中的t方法)。此時控制台輸出"執行Joo中的t方法"

  5. 此時應該執行System.out.println(b),我們想當然的以為應該是3,結果卻輸出了0,原因是這樣:我們在Joo的構造方法中加入了輸出語句,可是在控制台,此時並沒有輸出"Joo構造方法執行完畢",可見Joo的構造方法並沒有執行,就是b = 3的賦值語句同樣沒有執行,此時的b默認值為0,故控制台輸出了0。

  6. 此時t方法執行完畢,輸出"Joo中的t方法執行完畢",Ioo的構造方法也執行完畢,輸出"Ioo構造方法執行完畢"

  7. 父類Ioo的構造方法執行完畢,最後執行子類Joo的構造方法,我們看到,此時的b才被賦值為3,最後輸出"Joo構造方法執行完畢"

  8. 至此,模擬完成,有不懂的可以再hi我,不要hi這個號,這號只是為了臨時回答注冊的,如無意外,不會再上,我常用的叫kq346635081,在這條回答的評論里

㈢ Java 子類初始化的疑問,感覺是大牛的人進!

B b = new B();
∵B繼承A
∴B的run()方法覆蓋了A的run()方法
∵new B()首先隱含調用了super()
∴執行了public A(){run();}方法
∵這個run()方法是子類B的方法
又∵這時候子類B的構造方法還沒有執行
∴子類B的屬性i還沒有值
∴現在i是默認的0

樓主的困惑就在於沒有理清那個輸出0的run()方法是誰的run(),你分別在兩個run()方法里加入System.out.println("class A");System.out.println("class B")就能明白了。你可能會發現沒列印class A。

㈣ 請問Java能不能直接用子類初始化父類

其實回答你這個問題挺難的,因為你問的問題本身就是個問題,通過你問的問題,你很多概念其實沒有搞清楚...。
首先子類父類的繼承性問題是類之間的關系,而初始化是對象的問題(當然類也能初始化,但是這種初始化無關於子類父類,這也不牽扯到你問的問題)。對象是沒有父子的問題的,當你實例化一個類的對象出來,這個對象是屬於這個類以及這個類的所有父類的,即是說,如果User繼承Personnel再繼承Object,那麼你實例化一個User對象Jone,那麼Jone既是User的對象同時也是Personnel的對象同樣也是Object的對象,但是這里只有一個對象,沒有三個對象,Jone包含三個類的所有特性,包括屬性,方法等等。所以當你實例化Jone這個對象以後,它其實已經同時初始化三個類所定義的所有屬性。而java機制是從父類到子類初始化的。從這個概念上來講,實例化一個類的對象出來,那麼久必須把這個類的所有父類定義的全部特性全部初始化,而且必須初始化,這不是能不能的問題,是必須這么做。
就目前而言,你對java內部的編譯和運行機制不甚了解的情況下,思考這種問題其實無益,你應該更多的著眼於目前的基礎知識,很多問題在你了解更多的知識以後這些都不是問題,你現在去想這種似是而非的問題,會讓你思維混亂的,因為你這個問題的本身問法就是錯的,從一個錯誤的問題出發,即使別人給你回答,那麼怎麼回答都是錯的,別人需要從很基礎的知識一點一點給你講,大多數人不會浪費這么多時間不會跟你解釋的,你要注重自我學習,不要亂提錯誤的問題。

㈤ 當java父類和子類都有構造函數時,求子類對象初始化過程詳解

你好,初始化過程是這樣的:
1.首先,初始化父類中的靜態成員變數和靜態代碼塊,按照在程序中出現的順序初始化;
2.然後,初始化子類中的靜態成員變數和靜態代碼塊,按照在程序中出現的順序初始化;
3.其次,初始化父類的普通成員變數和代碼塊,在執行父類的構造方法;
4.最後,初始化子類的普通成員變數和代碼塊,在執行子類的構造方法;
最後,給你個例子吧。你運行著幫助理解。
class Super{
public static int a ;
private int b ;

static{
System.out.println("此時a的值為:" + a) ;
a = 10 ;
}
public Super(){
System.out.println("此時a的值為:" + a) ;
System.out.println("此時b的值為:" + b) ;
b = 20 ;
}
{
System.out.println("此時b的值為:" + b);
b = 30 ;
}
}
class Sub extends Super{
public static int aa ;
private int bb ;

static{
System.out.println("此時aa的值為:" + aa) ;
aa = 10 ;
}
public Sub(){
System.out.println("此時aa的值為:" + aa) ;
System.out.println("此時bb的值為:" + bb) ;
bb = 20 ;
}
{
System.out.println("此時bb的值為:" + bb);
bb = 30 ;
}
}
public class ConstructorTest {
public static void main(String[] args) {
new Sub() ;
}
}

㈥ java 編寫一個子類(選擇在子類中初始化父類成員方法)

super,超類,即父類。當你實例化一個子類的時候,編譯器會自動查找子類的父類,並先將父類初始化。
當你的子類使用帶參數的構造函數時,你必須保證該子類的父類也有相同的帶參數的構造器。
1.super(),它用來告訴編譯器,爺我用的是哪個型號的構造器,方便你找俺老子。
2.super.屬性,用於訪問父類屬性或方法。
比如,
public class Father(){
public Father(){}
public Father(String name,String sex){
this.name=name;
this.sex=sex;
}
public String name="免貴姓唐";
public String sex;
}
public class Son_1(){
public Son_1()
public Son_1(String name,String sex){
super(name,sex);
}
public String name="真的免貴";
public static void main(String[] arg){
print(super.name+" "+name);
}
}

快睡了,思維有點混。不懂hi我好了。568418555,Q我也成。

㈦ Java 構造方法初始化順序

初始化子類,調用子類有參的時候默認情況下也是先去調用父類的無參構造,除非你在子類的構造方法中使用super來指明調用父類中的哪個構造方法。

㈧ java 初始化其子類必先初始化其父類什麼意思

因為子類的構造函數裡面必然調用了父類的構造函數
一般來說,子類的構造函數裡面會隱式的調用父類的構造函數,就是那個super.什麼什麼的
因為隱式調用,所以看不到。但是是存在的。如果你顯式的調用那麼必須放在第一行。
而且從理論上來說,既然你要初始化子類,子類會繼承父類的一部分屬性和方法,如果你不初始化父類,那麼子類豈不是沒有意義。繼承不了父類的屬性和方法。
所以,初始化子類必須要初始化父類

㈨ java中繼承及子類初始化問題

在語句A a=new A();中
new的作用是為對象a分配內存並將a的來自S的欄位x和來自A的欄位x都初始化為默認值0。
A()的作用是調用類A的構造器。當進入A的構造器的調用後,super()將調用父類S的構造器,在S的構造器中會再調用類Object的構造器,然後從Object的構造器返回,執行S的欄位初始化語句public int x=6;(這是編譯器自動為你執行的),然後返回到S的構造器中,再調用test方法,由於A復寫了超類S的test方法,所以多態機制會發生作用,這里實際上調用的是A類的test方法,輸出的是來自A的x的值,從前面可知,它的值還是0,所以輸出0。接著調用從S的構造器返回,執行A的初始化語句public int x=5;(同樣,這是編譯器自動為你執行的),再返回到A的構造器中,完成對象a的構造。接著調用a.test();自然調用的是類A的test方法,輸出的是來自A的當前x的值5。

㈩ java初學者:子類繼承父類,子類初始化會調用父類的構造方法,是不是因為子類要想實例化必須父類先實

子類要想實例化必須先實例化父類

因為子類繼承父類,繼承的是父類中的成員(成員變數及成員方法),要想使用父類的成員就得實例化父類,才能使用
情況一:父類有無參構造方法
JAVA默認是會調用父類的構造方法的,在子類的構造函數中,編譯器會自動的加一個super來調用父類的構造方法
情況二:父類的構造方法是帶參數的,而且沒有無參數的構造方法
那麼在子類的構造方法中必須顯式地調用父類的構造方法。

閱讀全文

與java子類初始化相關的資料

熱點內容
ctcpip編程 瀏覽:520
java統計字元串次數 瀏覽:254
中興交換機zxr10vlan配置命令 瀏覽:829
java面試spring 瀏覽:145
得物程序員加班厲害嗎 瀏覽:958
h1z1東京伺服器地址 瀏覽:397
海賊王一番賞文件夾什麼樣 瀏覽:847
24bit高頻精品解壓音樂 瀏覽:181
api程序員遇到更新 瀏覽:298
程序員程序運行搞笑圖 瀏覽:772
秦思怎麼下載app 瀏覽:691
發抖音怎麼發自己的APP網站 瀏覽:362
androidinbitmap 瀏覽:774
lzma源碼使用 瀏覽:748
ibm伺服器湖南經銷商雲伺服器 瀏覽:991
正規模板建站配雲伺服器商家 瀏覽:876
安卓清楚緩存命令 瀏覽:380
汽車壓縮機電磁離合器損壞怎麼修 瀏覽:508
怎麼提取安卓軟體 瀏覽:597
單片機和主機高速傳文件 瀏覽:480