我是Java的新手,请看下面的代码
//Parent Class
public class Abc {
Abc(){System.out.println("hiii");
}
}
//Child Class
public class CDE extends Abc{
@Test
public void Xyz(){
System.out.println("hi");
}
}
Output is coming as
hiii
hi
PASSED: Xyz
请帮助,我不知道为什么在我甚至没有使用新的关键字创建对象时调用父类的构造函数。我在Eclipse中创建了两个不同的类。如果我创建main,则不会发生这种情况子类中的方法,即不使用TestNG @Test注释。
答案 0 :(得分:0)
它叫做Constructor Chaining。它通过使用继承来实现。子类构造函数方法的ALWAYS调用其超类的构造函数方法。这确保了子类对象的创建始于继承链中它上面的类的初始化。
继承链中可能有任意数量的类。每个构造函数方法都将调用链,直到达到并初始化顶部的类。然后,当链条回到原始子类时,下面的每个后续类都被初始化。此过程称为构造函数链接。
答案 1 :(得分:0)
当你使用TestNG的@Test
注释时,这就是TestNG在幕后所做的事情。
@Test
,@BeforeClass
等),并以TestNG方式对它们进行排序(即{{1} },@BeforeSuite
,@BeforeTest
,@BeforeClass
等等)你的基类构造函数被调用的原因是由于TestNG通过反射实例化你的子类,这会触发构造函数链上传继承阶梯(这就是所谓的构造函数链接)
您可以通过向子类@Test
添加构造函数并添加CDE
来测试此理论。您将看到正在执行的print语句。
当您通过System.out.println
方法执行此操作时,不会涉及任何反射,因为不涉及TestNG。