亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

構造方法的初始化順序

2019-11-18 11:53:51
字體:
來源:轉載
供稿:網友

  想像一下你正在用java寫程序,并且用下面的代碼初始化類 A 和 B 的對象:
  
  class A {
  int a = f();
  int f() {
  return 1;
  }
  }
  
  class B extends A {
  int b = a;
  int f() {
  return 2;
  }
  }
  
  public class CtorDemo1 {
  public static void main(String args[]) {
  B bobj = new B();
  System.out.PRintln(bobj.b);
  }
  }
  
  現在,似乎很明顯的當初始化完成后,bobj.b的值將是1。究竟,類B中的b 的值是用類A中的a的值初始化的,而a 是用f 的值初始化的,而它的值為1,對嗎?
  
  實際上, bobj.b 的值是2,要知道為什么需要知道對象初始化的問題。
  
  當一個對象被創建時,初始化是以下面的順序完成的:
  
  1. 設置成員的值為缺省的初始值 (0, false, null)
  2. 調用對象的構造方法 (但是還沒有執行構造方法體)
  3. 調用父類的構造方法
  4. 使用初始化程序和初始塊初始化成員
  5. 執行構造方法體
  
  看看在實際中是如何一步一步完成的,看看下面的例子:
  
  class A {
  A() {
  System.out.println("A.A called");
  }
  }
  
  class B extends A {
  int i = f();
  int j;
  {
  j = 37;
  System.out.println("initialization block executed");
  }
  
  B() {
  System.out.println("B.B called");
  }
  
  int f() {
  System.out.println("B.f called");
  return 47;
  }
  }
  
  public class CtorDemo2 {
  public static void main(String args[]) {
  B bobj = new B();
  }
  }
  
  程序的輸出是:
  
  A.A called
  B.f called
  initialization block executed
  B.B called
  
  B 的構造方法被調用,但是最先做的事情是隱含的調用父類的構造方法。父類必須自己負責初始化它自己的狀態而不是讓子類來做。
  
  然后B對象的成員被初始化,這包含一個對B.f 的調用和包圍在{}中的初始塊的執行。最后B的構造方法體被執行。
  
  你可能會問“什么是對父類的構造方法的隱含調用”。這意味著假如你的構造方法的第一行不是下面內容之一:
  
  super();
  super(args);
  this();
  this(args);
  
  則有下面的調用:
  
  super();
  
  提供給構造方法的第一行。
  
  假如類沒有構造方法呢?在這種情況下,一個缺省的構造方法(也叫"無參構造方法")由java編譯器自動生成。缺省構造方法只有在類沒有任何其它的構造方法時才產生。
  
  更深入的明白這個,假設在文件A.java中有這樣的代碼:
  
  public class A {
  public static void main(String args[]) {
  A aref = new A();
  }
  }
  
  假如你想編譯然后列出A.class 中的字節碼,輸入下面的內容:
  
  $ javac A.java
  $ javap -c -classpath . A
  
  輸出:
  
  Compiled from A.java
  public class A extends java.lang.Object {
  public A();
  public static void main(java.lang.String[]);
  }
  
  Method A()
  0 aload_0
  1 invokespecial #1
  4 return
  
  Method void main(java.lang.String[])
  0 new #2
  3 dup
  4 invokespecial #3
  7 astore_1
  8 return
  
  在main 中,注重對 A 的構造方法的調用(就是invokespecial 行),以及A的構造方法中產生的類似的對Object 構造方法的調用。
  
  假如父類沒有缺省構造方法,你必須明確使用"super(args)"調用父類的某個構造方法,例如,下面是一個錯誤的用法:
  
  
  class A {
  A(int i) {}
  }
  
  class B extends A {}
  
  在上面的情況下, A 沒有缺省的構造方法,但是B的構造方法必須調用A的某個構造方法。
  
  讓我們來看看初始化的另一個例子:
  
  class A {
  A() {
  System.out.println("A.A called");
  }
  
  A(int i) {
  this();
  System.out.println("A.A(int) called");
  }
  }
  
  class B extends A {
  int i = f();
  int j;
  {
  j = 37;
  System.out.println("initialization block executed");
  }
  
  B() {
  this(10);
  System.out.println("B.B() called");
  }
  
  B(int i) {
  super(i);
  System.out.println("B.B(int) called");
  }
  
  int f() {
  System.out.println("B.f called");
  return 47;
  }
  }
  
  public class CtorDemo3 {
  public static void main(String args[]) {
  B bobj = new B();
  }
  }
  
  程序的輸出是:
  
  A.A called
  A.A(int) called
  B.f called
  initialization block executed
  B.B(int) called
  B.B() called
  
  這個例子明確使用super() 和 this() 調用。this()調用是調用同一個類中的另一個構造方法;這個方法被稱為“顯式構造方法調用”。當那樣的構造方法被調用,它將執行通常的s uper() 過程以及后續的操作。這意味著A.A 的方法體在A.A(int)之前執行,而這兩個都在B.B(int) 和B.B 前執行。
  
  假如返回第一個例子,你就可以回答為什么打印的是2而不是1。B 沒有構造方法,因此生成一個缺省構造方法,然后它調用super(),然后調用A 產生的缺省構造方法。
  
  然后A中的成員被初始化,成員a 被設置為方法f()的值,但是因為B 對象正被初始化,f() 返回值2。換句話說,調用的是B中的f()方法。
  
  A產生的構造方法體被執行,然后B的成員被初始化,而b 被賦予值a,也就是2。最后,B的構造方法被執行。
  
  最后一個例子說明了第一個例子的一個小小的變異版本:
  
  
  class A {
  int a = f();
  int f() {
  return 1;
  }
  }
  
  class B extends A {
  int b = 37;
  int f() {
  return b;
  }
  }
  
  public class CtorDemo4 {
  public static void main(String args[]) {
  B bobj = new B();
  System.out.println(bobj.a);
  System.out.println(bobj.f());
  }
  }
  
  程序的輸出是:
  0
  37
  
  你可能會期望輸出的兩個值bobj.a 和bobj.f()是一樣的,但是正如你看到的他們不一樣。這是正確的,即使是在a是從B的f方法中初始化的并且打印的是a 和 B的 f 方法的值。
  
  這兒的問題是當a通過對B的f方法調用而初始化,而該方法返回成員b的值,而該成員還沒有被初始化。因為這個,b的值就是剛開始的初始值0 。
  
  這些例子解釋了編程中重要的一點――在對象的構造階段調用可重載的方法是不明智的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91在线播放| 亚洲已满18点击进入在线看片| 国产视频综合在线| 国内精品小视频在线观看| 国产午夜精品免费一区二区三区| 国产91在线视频| 成人激情电影一区二区| 另类图片亚洲另类| 日韩一级黄色av| 日韩av在线一区二区| 国产精品视频免费观看www| 国产日韩欧美成人| 欧美视频一区二区三区…| 亚洲精品国产精品久久清纯直播| 成人激情黄色网| 日韩av免费在线播放| 91av在线精品| 日韩电影第一页| 久久精品亚洲94久久精品| 欧美极品xxxx| 日本精品久久久久久久| 欧美色视频日本高清在线观看| 日韩美女激情视频| 亚洲综合一区二区不卡| 欧美中文在线免费| 日韩av中文字幕在线播放| 久久久国产精品免费| 欧美亚洲第一区| 在线视频欧美日韩精品| 国产日韩换脸av一区在线观看| 中文字幕9999| 国产精品视频资源| 亚洲午夜激情免费视频| 性视频1819p久久| 亚洲精品久久久一区二区三区| 欧美日韩国产黄| 欧美成人一二三| 日韩久久午夜影院| 亚洲九九九在线观看| 国产精品久久久久久一区二区| 欧美精品一区二区三区国产精品| 亚洲视屏在线播放| 7m精品福利视频导航| 国产精品午夜国产小视频| 96精品久久久久中文字幕| 91精品免费视频| 中文字幕亚洲第一| 国产精品一二三在线| 国产性猛交xxxx免费看久久| 国产亚洲成精品久久| xx视频.9999.com| 国产一区二区三区毛片| 亚洲国产高潮在线观看| 精品国偷自产在线| 色噜噜亚洲精品中文字幕| 久久精品国产成人| 国产精品视频一区国模私拍| 日韩高清av一区二区三区| 亚洲午夜性刺激影院| 日韩中文字幕不卡视频| 日韩电影中文字幕在线观看| 国产亚洲欧美视频| 日韩亚洲在线观看| 欧美性猛交xxxx富婆| 欧美一级淫片aaaaaaa视频| 欧美国产日韩xxxxx| 久久久久久久久综合| 91久久精品国产91性色| 超碰91人人草人人干| 成人国产在线视频| 久久av.com| 国产一区二区三区在线播放免费观看| 国产精品久久久久91| 日韩中文综合网| 久久亚洲精品国产亚洲老地址| 亚洲国产欧美一区二区丝袜黑人| 欧美午夜www高清视频| 国产精品美女网站| 久热精品视频在线观看| 亚洲精品一区二区久| 日韩美女免费线视频| 欧美另类交人妖| 国产狼人综合免费视频| 欧美日韩一区二区三区在线免费观看| 97视频免费看| 欧美区二区三区| 欧美日韩中文字幕在线| 亚洲一区二区自拍| 亚洲国产精品热久久| 久久久中文字幕| 国产精品久久久久7777婷婷| 亚洲欧美在线免费观看| 久久福利网址导航| 欧美精品中文字幕一区| 国产亚洲欧美日韩美女| 国产一区二区视频在线观看| 日韩高清有码在线| 国产精品日韩一区| 992tv成人免费视频| 色综合久久悠悠| 91精品国产高清久久久久久| 欧美精品久久久久| 最近2019好看的中文字幕免费| 91精品久久久久久综合乱菊| 国产a∨精品一区二区三区不卡| 日本国产一区二区三区| 亚洲精品91美女久久久久久久| 欧美性感美女h网站在线观看免费| 一区二区日韩精品| 色99之美女主播在线视频| 中文字幕欧美日韩va免费视频| 精品久久久久久久中文字幕| 午夜精品久久久久久久99黑人| 91欧美激情另类亚洲| 高清欧美性猛交xxxx| 色妞色视频一区二区三区四区| 日韩欧美中文字幕在线观看| 国产成人精品久久二区二区| 亚洲综合第一页| 欧美日韩一二三四五区| 日韩精品视频在线观看网址| 亚洲第一男人天堂| 高清欧美电影在线| 性欧美在线看片a免费观看| 欧美多人乱p欧美4p久久| 国产精品成人播放| 精品亚洲一区二区三区| 97在线视频免费观看| 在线成人激情视频| 欧美最猛性xxxxx亚洲精品| 亚洲精品女av网站| 国产午夜精品美女视频明星a级| 黑人精品xxx一区一二区| 亚洲摸下面视频| 国产精品第10页| 热re99久久精品国产66热| 九九热这里只有在线精品视| 欧美日韩一区二区在线| 国产aaa精品| 欧美日韩激情美女| 日韩欧美在线观看| 日韩国产在线播放| 亚洲欧洲国产精品| 青青久久av北条麻妃黑人| 在线播放日韩av| 亚洲第一视频在线观看| 久久伊人91精品综合网站| 777精品视频| 性欧美xxxx视频在线观看| 成人日韩在线电影| 欧美在线不卡区| 中文字幕亚洲欧美在线| 国产精品久久久亚洲| 国产一区二区丝袜| 欧美性xxxx极品hd欧美风情| 亚洲最大福利视频网站| 成人黄色激情网| 欧美在线不卡区| 久久久久久久久久久免费| 亚洲人成欧美中文字幕| 日韩国产高清视频在线| 亚洲性av网站| 亚洲成人a**站| 成人免费午夜电影|