JVM需要调用超类构造函数吗?
public class Test1{
public void dis()
{
System.out.println("In Test1");
}
}
public class Test2 extends Test1{
public void dis()
{
System.out.println("Inside test2");
super.dis();
}
}
由于dis()
是一个实例方法,可以安全地假设super指向父类对象,因为构造函数是自动调用的吗?
答案 0 :(得分:1)
super
关键字对以下内容非常有用:
您的示例显示了第一个案例,当在dis()
的实例上调用Test2
时,程序必须按此顺序打印:
Inside test2
In Test1
答案 1 :(得分:1)
可以安全地假设super指向父类对象
super
关键字用于访问当前对象上的直接超类成员。它不引用任何超类对象。
因为构造函数是自动调用的吗?
super
关键字的作用不依赖于被调用的超类构造函数。超类构造函数总是通过构造函数链接调用,使用super()
调用no-arg或参数化构造函数。
链接超类构造函数和调用超类成员之间的一个区别是:“在链接构造函数时,super()
调用必须是构造函数中的第一个语句,而您可以在任何时候调用超类方法在你当前的方法“。
答案 2 :(得分:1)
关键字super
未指向某些“父类对象”。它是一个名称限定符,因此您可以引用父类中为当前对象定义的方法。因此,在以下内容中:
public class Test2 extends Test1{
public void dis()
{
System.out.println("Inside test2");
super.dis();
}
}
调用super.dis()
调用此对象的父类中定义的dis()
方法。它不会调用名为dis()
的其他对象的super
方法。
构造函数正在发生一些不同的事情。每个构造函数都必须始终调用父类中的某个构造函数。您可以使用super
关键字明确执行此操作:
public class Test2 extends Test1{
public Test2() {
super(); // explicitly invokes parent class default constructor
. . .
}
}
如果没有显式调用特定的父类构造函数,编译器会自动插入对默认(无参数)父类构造函数的调用。对父类构造函数(如果存在)的调用必须是构造函数中的第一个语句。但是,在某个方法中,super.
可以用作任何名称的限定符(如果名称是父类的成员)。
答案 3 :(得分:0)
这与构造函数无关。由于Test2 extends Test1
和dis()是在两个类中实现的,因此子类中的super.dis()将调用超类中的dis()。
答案 4 :(得分:0)
使用超级构造函数,我们可以直接从中调用函数和变量
的子类中的超类public class Test1{
int a=5;
}
public class Test2 extends Test1{
int a=15;
int c;
c=a+super.a;
System.out.println("value of c is:"+
}
result :value of c is:20
you can call default constructor of super class by super() .
if there is variables then you can call it by super(parameter_list).