例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("回钦波,你好");
??? }
???????
?}