在一個繼承Activity的類中,不能同時讓onCreate和建構函式同時出現嗎?

來源:互聯網
上載者:User

標籤:android   style   http   color   java   使用   io   for   

在一個繼續Activity的類中,不能同時讓onCreate和建構函式同時出現嗎??
參考:http://bbs.csdn.net/topics/390321638


如果不能,原因為何?

如果能,為什麼會出現錯誤?

先看一下java 的例子.

//A.javapublic class A {public A() {System.out.println("===a 構造=====");}}/B.javapublic class B {static A a = new A();static {System.out.println("===B static===");}public B(){System.out.println("B 構造");}{System.out.println("===B 動態===");}}//C.javapublic class C {/** * @param args */public static void main(String[] args) {try {Class aClass = Class.forName("B");Object anInstance = aClass.newInstance();} catch (Exception e) {e.printStackTrace();}        System.out.println("====================");B b = new B();}}/*列印結果===a 構造========B static======B 動態===B 構造=======================B 動態===B 構造*/

因此,無論new B(),還是 Class.newInstance()構造B,都會調用到無參構造.

//A.javapublic class A {public A() {System.out.println("A 無參數構造");}}//B.javapublic class B {public B() {System.out.println("B 無參數構造");}}//MainActivity.javapublic class MainActivity extends Activity {static B b = new B();static {System.out.println("靜態代碼塊");}A a = new A();{System.out.println("動態代碼塊");}public MainActivity() {System.out.println("Activity 構造");//Context ct=this;//ct.getText(R.string.app_name);}@Overrideprotected void onCreate(Bundle savedInstanceState) {System.out.println("onCreate");super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}
列印結果

B 無參數構造
靜態代碼塊
A 無參數構造
動態代碼塊
Activity 構造
oncreate

如果改成 MainActivity()

將會出現

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.test/com.example.test.MainActivity}: java.lang.IllegalAccessException: access to constructor not allowed

如果改成

public MainActivity() {
System.out.println("Activity 構造");
Context ct=this;
ct.getText(R.string.app_name);
}

將會出現

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.test/com.example.test.MainActivity}: java.lang.NullPointerException

at com.example.test.MainActivity.<init>(MainActivity.java:25)

at java.lang.Class.newInstanceImpl(Native Method)

at java.lang.Class.newInstance(Class.java:1130)

從中還可以發現,Class.newInstance.

實際上,成員變數定義的時候是不能同時初始化的(?).只是書寫的時候可以這樣做,但是編譯的時候被處理掉.

<clinit>方法會這樣初始化:1,靜態成員變數,2靜態代碼塊

<init>(多少個構造方法就有多少個) 順序 1.super()2初始化一般成員變數.3動態代碼塊.4構造方法的除super()剩餘的代碼.如果構造方法存在this(),即調用其他構造.super()將會在其他不使用this()的構造中先執行-實際上將this() 替換進去進可以知道結果了.注意 this().super()都只能寫在第一行.super是存在的. 當使用的是父類的無參構造時可以不寫.但是其還是執行的.其他必須寫!!!

如

public class G extends H{int a;int b;public G(int a, int b) {super(5);System.out.println("g(int,int)");this.a = a;this.b = b;}public G(int a){this(a,3);System.out.println("g(int)");}public G(){this(2);System.out.println("g()");}public static void main(String[] args) {G g=new G();}}

輸出

g(int,int)
g(int)
g()

從中可以知道,Android 執行個體化Activity,是通過Class.newInstance實現的,調用的必須是無參構造,不能是private修飾的!可以是預設不寫,如果存在帶參數的構造,也必須存在無參構造.也正因為如此,只有無參構造,就不必寫這個構造方法了.不寫這個無參構造了,還是可以使用動態代碼塊初始化的.也正因為如此,更加不用顯式地寫這個無參構造了!!!

眾所周知,在Activity中一個重要的橋樑就是上下文 Context.

如果這樣寫

public MainActivity() {
System.out.println("Activity 構造");
Context ct=this;
ct.getText(R.string.app_name);
}

將會出現異常.所以在onCreate之前只能初始化與context無關的,與context有關的都不應該放在onCreate之前.所以,既然不不能調用context有關的方法,在onCreate之前初始化就沒什麼意義了.要初始化的寫成一個init方法,放在onCreate.方便快捷.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.