![](/img/trans.png)
[英]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.