默认构造函数在超类中调用no_argument构造函数 这最后一个构造函数用于实例化该类的对象,如何?我的意思是超类构造函数主体究竟做了什么?
示例
public class Child extend Fragment {}
如果我试图实例化这个类Child
Child a = new Child() ;
编译编译器时在Fragment类中调用无参数构造函数。 在android.app包中我发现无参数构造函数没有正文
public Fragment() {}
问题这个构造函数如何有用?它什么都不做!
P.S 我的意思是
它是如何实例化它的类虽然它是空的,实例化超类的代码在哪里?
答案 0 :(得分:1)
调用超类构造函数的语法是
super();
或:
super(parameter list);
问这个构造函数如何有用?它什么都不做!
超级构造函数可用于初始化所有子类的公共属性。如果它是空的,它仍然可以被反射API使用。
Fragment.class.getConstructor().newInstance();
或
Child a = new Child() ;
a.getClass().getSuperclass().getConstructor().newInstance();
最后一行显式调用超类的构造函数。
答案 1 :(得分:1)
问这个构造函数如何有用?它什么都不做!
构造函数的目的,无论是否为空,都是提供类的实例。构造函数体(如果存在)可以在首次创建实例时进一步执行必要的其他操作。
构造函数本身可能没有做任何事情,但它返回一个实例,您可以在该实例上进一步调用类中定义的公共方法。
例如,在您提到的Fragment
类中,我们假设有attach()
方法。如果attach()
方法是非静态的,则需要创建一个实例(使用空构造函数)在其上调用attach()
方法,而不管构造函数是否执行任何操作。
它如何实例化它的类,尽管它是空的
构造函数不需要在其实体中实例化任何代码。
调用new ClassName()
(使用适当的参数,如果有的话)就足够了。 JVM的工作是在运行时创建对象。您不需要在构造函数中编写任何特定代码。如果您愿意,这些额外的代码可以通过设置一些字段或调用方法等来帮助实例从特定状态开始。
实例化超类的代码在哪里?
子类(或任何类)中的构造函数仅生成该类的实例。它不需要实例化其超类。如果它有一些重要的初始化代码,你可以调用超类构造函数(使用super()
),但它不是强制性的。此外,来自超类的子类don't inherit constructors。但他们确实继承了公共和受保护的领域和方法。
关于Fragment
课程,您对其使用有一些疑惑,可以澄清here。
答案 2 :(得分:0)
空构造函数(也称为默认构造函数)仅表示可以在没有任何进一步工作的情况下创建实例。这可能是由于框架要求或属性的默认值即时。
如果空构造函数是类中唯一的构造函数,则不需要编写它,默认情况下就是它。
虽然如果有其他构造函数(带参数),则必须显式声明默认构造函数。