关于超级关键字?

时间:2013-07-18 18:48:10

标签: java constructor keyword super

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

5 个答案:

答案 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).