例1: supper不用在static 方法是可用的:
super关键字用法详解:
子类可以继承父类当中的非私有成员变量和成员方法(不是以private关键字修饰的)作为自己的成员变量和成员方法,但是,如果子类中声明的成员变量与父类的成员变量同名,则子类不能继承父类当中的成员变量。如果子类中声明的成员方法与父类的成员方法同名,并且方法的返回值及参数个数与类型也相同,则子类不能继承父类的成员方法,此时称子类的成员方法覆盖了父类的成员方法。这时,如果想在子类中访问父类中被子类隐藏的成员方法或变量时,就可以使用super关键字。
super关键字主要有以下两种用途:
1. 调用父类的构造方法:子类可以调用由父类声明的构造方法,但是必须在子类的构造方法中使用super关键字类调用。其具体的语法格式如下:super([参数列表])。
class Student{
String name;
int number;
public Student(String name,int number){
this.name=name;
this.number=number;
System.out.println("I’m "+name+" and my number is "+number);
}
}
class Univer_Student extends Student{
boolean b;
Univer_Student(String name,int number,boolean b){
// 用super()关键字调用父类中的构造方法
// 如果是用不带参数的super()则调用父类中默认的构造方法
// 注意:如果调用的是不带参数的构造方法,在父类当中没有不带参数的构造方法则会报错
super(name,number);
this.b=b;
System.out.println("婚否:"+b);
}
}
public class Super1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Univer_Student zhang=new Univer_Student("zhang",987,false);
}
}
运行结果为:
I’m zhang and my number is 987
婚否:false
注意事项:如果子类的构造方法中没有显示地使用super关键字调用父类的某个构造方法,那么默认地有:super()语句,即调用父类中不带参数的构造方法。如果父类没有提供不带参数的构造方法,就会出现错误。
2. 操作被隐藏的成员变量和被覆盖的成员方法:如果想在子类中操作父类中被隐藏的成员变量和被覆盖的成员方法,也可以使用super关键字,具体格式如下:super.成员变量;super.成员方法([成员方法])。
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();//调用父类中的成员方法并赋给局部变量c
return c/n;
}
float g(){
float c;
c=super.f();//调用父类中的成员方法并赋给局部变量c
return c/2;
}
}
public class Super2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
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.5
result_2=2525.0
例2:supper用在static 方法中报错:
package test;
public class TestInterface extends String1{
public int i = 6;
public static final int a = 2;
public static final int b = 3;
static int bb;
public TestInterface(){
super();
}
public static void main(String args[]){
System.err.println(a);
System.err.println(super.i); //这里会报错,翻译过来就是 supper不允许放到static 方法下面
}
public void i(){
bb= super.i;
System.err.println(super.i); //这里不报错,这里是允许的
}
}
class String1 {
public int i =11;
public void test(){
System.err.println("回钦波,你好");
}
}