[英]How to instantiate generic class which has a private constructor with an argument
[英]How does default constructor used to instantiate object if it's super class no argument constructor has empty body?
默認構造函數在超類引用中調用 no_argument 構造函數,最后一個構造函數用於從此類實例化對象,如何? 我的意思是超類構造函數體到底是做什么的?
例子
public class Child extend Fragment {}
如果我試圖實例化這個類 Child
Child a = new Child() ;
在編譯編譯器時調用 Fragment 類中的無參數構造函數。 在 android.app 包中,我發現無參數構造函數沒有主體
public Fragment() {}
問題這個構造函數如何有用? 它什么都不做!
PS我的意思是
雖然它是空的,它如何實例化它的類,實例化超類的代碼在哪里?
調用超類構造函數的語法是
super();
或者:
super(parameter list);
問題這個構造函數如何有用? 它什么都不做!
超級構造函數可用於初始化所有子類共有的屬性。 如果它是空的,它仍然可以被反射 API 使用。
Fragment.class.getConstructor().newInstance();
或者
Child a = new Child() ;
a.getClass().getSuperclass().getConstructor().newInstance();
最后一行顯式調用超類的構造函數。
問題這個構造函數如何有用? 它什么都不做!
構造函數的目的,無論是否為空,都是提供類的實例。 構造函數體(如果存在)可能會在首次創建實例時進一步執行其他必要的操作。
構造函數本身可能不做任何事情,但它返回一個實例,您可以在該實例上進一步調用類中定義的公共方法。
例如,在您提到的Fragment
類中,假設有一個attach()
方法。 如果attach()
方法是非靜態的,則無論構造函數是否執行任何操作,您都需要創建一個實例(使用空構造函數)來調用其上的attach()
方法。
盡管它是空的,它如何實例化它的類
構造函數不需要在其主體中實例化任何代碼。 調用new ClassName()
(使用適當的參數,如果有的話)就足夠了。 在運行時創建對象是 JVM 的工作。 您不需要為此在構造函數中編寫任何特定代碼。 如果您願意,額外的代碼可以通過設置一些字段或調用方法等來幫助實例以特定狀態開始。
實例化超類的代碼在哪里?
子類(或任何類,就此而言)中的構造函數僅生成該類的實例。 它不需要實例化它的超類。 如果它有一些重要的初始化代碼,您可以調用超類構造函數(使用super()
),但這不是強制性的。 此外,子類不從超類繼承構造函數。 但它們確實繼承了公共和受保護的字段和方法。
關於Fragment
類,您對其使用有一些困惑,可以在此處澄清。
空構造函數(又名默認構造函數)意味着只能創建一個實例而無需任何進一步的工作。 這可能是由於框架要求或屬性的默認值的實例化是可以的。
如果空構造函數是類中唯一的構造函數,則不需要編寫它,默認情況下它就在那里。
盡管如果有其他構造函數(帶參數),則必須明確說明默認構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.