2013-07-18 55 views
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()是一个实例方法,它是安全的假设,超指向父类对象,因为构造函数被自动调用?

+0

'syso' .....:?d – Maroun

+0

sorry..System.out。 println – Ullas

+0

顺便说一下,你可以很容易地测试它,只需要一个主要的并运行你的程序。 – Maroun

回答

1

关键字super不指向某些“父类对象”。它是一个名称限定符,因此您可以参考当前对象的父类中定义的方法。因此,在下文中:

public class Test2 extends Test1{ 
    public void dis() 
    { 
     System.out.println("Inside test2"); 
     super.dis(); 
    } 
} 

呼叫super.dis()调用在父类中定义该对象的方法dis()。它不调用其他一些名为super的对象的dis()方法。

与构造函数有点不同。每个构造函数都必须始终调用父类中的某个构造函数。为此,您可以明确地使用super关键字:

public class Test2 extends Test1{ 
    public Test2() { 
     super(); // explicitly invokes parent class default constructor 
     . . . 
    } 
} 

如果不明确调用特定的父类的构造函数,编译器会自动插入到默认的(无参数)父类的构造函数的调用。对父类构造函数的调用(如果存在)必须是构造函数中的第一个语句。然而,在一种方法中,super.可以用作任何名称的限定符,只要它被使用(假定该名称是父类的成员)。

1

super关键字是有用的:

  • 调用父类的执行这一类
  • 访问超类重写的方法从子类构造函数的构造

你的例子显示第一个案件在行动时,在Test2的实例上调用dis()时,程序必须按以下顺序打印:

Inside test2 
In Test1 
1

是安全的假设,超指向父类对象

super关键字用来访问直接超类的当前对象成员。它不涉及任何超类对象。

因为构造函数被automaticallt调用?

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

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

0

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

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