今天在構造方法中使用this關鍵字,還是感覺在原理中弄不明白,this關鍵字代表本類的這個對象。在構造方法中的使用方式分為兩類。
第一類是使用this調用其它構造函數,這個沒什么好說的
public NodeTree(Context context) throws IllegalArgumentException, IllegalAccessException{ this(context, null, 0); } public NodeTree(Context context, AttributeSet attrs, int defStyle) throws IllegalArgumentException, IllegalAccessException { super(context, attrs, defStyle); Log.d("TAG", "NodeTree"); this.context = context; initData(); initContent(context,10); }
第二類是使用this關鍵字為當前對象的各個字段(Field)初始化,還接着以上代碼,多次使用了this,寫的時候還納悶當前對象還沒有創建完成啊,能不能再這樣去addView()(nodetree是繼承LinearLayout的)
private void initContent(final Context context,int defaultExpandLevel) throws IllegalArgumentException, IllegalAccessException { Log.d("TAG", "initContent"); // TODO Auto-generated method stub mAllNodes = TreeHelper.getSortedNodes(mDatas2, defaultExpandLevel); mVisiNodes = TreeHelper.filterVisibleNode(mAllNodes); this.setOrientation(LinearLayout.VERTICAL); listView = new ListView(context); LinearLayout.LayoutParams params =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.MATCH_PARENT,1); listView.setLayoutParams(params); this.addView(listView); reLayout= new RelativeLayout(context); LinearLayout.LayoutParams params1 =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.MATCH_PARENT,6); reLayout.setLayoutParams(params1); reLayout.setId(0x1234); reLayout.setGravity(Gravity.CENTER_VERTICAL); FillButtonUtil.fillButtons(context, reLayout); this.addView(reLayout); mAdapter = new SimpleTreeAdapter<FileBean>(listView, context, this); listView.setAdapter(mAdapter); }
事實上,還是對java虛擬機的工作過程不太熟悉,在創建對象(new)時,JM首先會在方法區創建申請一塊內存空間,其中有個對象頭,儲存對象的類信息、地址信息、GC回收分代等信息,這時候只是個空對象。之后才會進入到構造方法,為當前對象的各個字段或者說各方面的屬性作初始化,這個過程中去為對象添加一個孩子是沒有什么問題的,在內存中的表現就是對象的內存空間會多出一個指針記錄孩子的相關信息。