一 super关键字
我们已经知道,如果子类中定义的成员变量和父类中的成员变量同名时,则父类中的成员变量不能被继承,此时称子类的成员变量隐藏了父类的成员变量。当子类中定义了一个方法,并且这个方法的名字,返回类型,用参数个数和类型和父类的某个方法完全相同时,父类的这个方法将被隐藏,既不能被子类继承下来。如果我们在子类中想使用被子类隐藏的父类的成员变量或方法就可以使用关键字super。
1 使用super调用父类的构造方法
子类不继承父类的构造方法。因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示。而且super必须是子类构造方法中的头一条语句。如例:
例子24:
class Student
{
int number;String name;
Student(int number,String name)
{
this.number=number;this.name=name;
System.out.println("I am"+name+"my number is"+number);
}
}
class Univer_Student extends Student
{
boolean 婚否;
Univer_Student(int number,String name,boolean b)
{
super(number,name);
婚否=b;
System.out.println("婚否="+婚否);
}
}
public class Example4_24
{
public static void main(String args[])
{
Univer_Student zhang=new Univer_Student(9901,"和晓林",false);
}
}
运行结果
I am 和晓林 my number is 9901
婚否=false.
需要注意的是:如果在子类的构造方法中,没有显示地使用super关键字调用父类的某个构造方法,那么默认地有
super();
语句,即调用父类的不带参数的构造方法。如果父类没有提供不带参数的构造方法,就会出现错误。
2 使用super操作被隐藏的成员变量和方法
如果我们在子中想使用被子类隐藏了的父类的成员变量或方法就可以使用关键字super。比如super.x,super.play(),就是被子类隐藏的父类的成员变量x和方法play()。
例子25:
class Sum
{
int n;
float f()
{
float sum=0;
for (int i=1;i<=n;i++)
sum=sum+i;
return sum;
}
}
class Average extends Sum
{
int n;
float f()
{
float c;
super.n=n;
c=super.f();
return c/n;
}
float g()
{
float c;
c=super.f();
return c/2;
}
}
public class Example4_25
{
public static void main(String args[])
{
Average aver=new Average();
aver.n=100;
float result_1=aver.f();
float result_2=aver.g();
System.out.println("result_1="+result_1);
System.out.println("result_2="+result_2);
}
}
运行结果
result_1=50.50
result_2=2525.0