0

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 指向父类对象是否安全,因为构造函数被自动调用?

4

5 回答 5

1

super关键字适用于:

  • 调用在此类中重写的方法的超类实现
  • 从子类构造函数访问超类的构造函数

您的示例显示了第一种情况,当调用程序dis()实例时Test2,必须按以下顺序打印:

Inside test2 
In Test1
于 2013-07-18T18:50:35.563 回答
1

假设 super 指向父类对象是否安全

super关键字用于访问当前对象上的直接超类成员。它不引用任何超类对象。

因为构造函数是自动调用的?

关键字的作用super不依赖于被调用的超类构造函数。超类构造函数总是通过构造函数链接super()调用,使用对无参数或参数化构造函数的调用。

链接超类构造函数和调用超类成员之间的一个区别是:“在链接构造函数时,super()调用必须是构造函数中的第一个语句,而您可以在当前方法的任何位置调用超类方法”。

于 2013-07-18T18:50:35.900 回答
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.无论在何处使用它,都可以用作任何名称的限定符(前提是该名称是父类的成员)。

于 2013-07-18T18:57:25.320 回答
0

这与构造函数无关。由于Test2 extends Test1和 dis() 在两个类中都实现了,所以子类中的 super.dis() 会调用超类中的 dis()。

于 2013-07-18T18:51:10.073 回答
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).
于 2013-07-18T19:14:40.283 回答