Java中super关键字用法介绍
有很对书上讲super所表示的是父类对象的引用(我现在有点置疑这个说法,如果它表示父类对象的引用, 那么照理说System.out.println(super);的时候, 是可以输出父类对象的表示形式.
但以上那句输出是错误的, 而System.out.println(this);则没问题, 下面是置疑之处, 既然super代表当前对象的父类对象的引用, 那么他的类型自然就是父类类型.
比如这里
代码如下 | 复制代码 |
class A{} class B extends A{ A print(){ return super; } } 那么此时编译器会报 此方法必须返回A类型, 难道这里的super 不是A类型吗?具体疑惑可以参看 super的疑惑 ) |
那么从这里, 我们也推翻了super是当前对象的父类对象的引用这句话,它只是一个关键字(具体更有力的证据,无法拿出,疑惑中….)
super并不是一个堆空间里面的一个对象的引用地址
这不就说明他不是对象的引用了吗
但它是引用 是父类的特征的引用
父类特征不是对象 所以不能说它是对象的引用
super可以用在哪里?
1.用在构造方法中:表示调用父类构造
(1)如: Parent(int i){} , Child(){} , 那么此时编译器会为我们在子类Child(){super();}中加上super();所以, 要么我们为父类提供无参构造方法,要么在子类中显式调用super(3);
super调用构造方法,只能在构造中的第一句
2.用在非静态方法中:可以调用父类的变量或者方法(非private)
super 调用父类对象的方法和变量,和this一样,有特殊的效果。
代码如下 | 复制代码 |
class Whuedu{ { String schoolName; String address; edu(String s,String add) { schoolName = s; address = add; printfEdu(); } public void printEdu() { //super 调用父类的方法 super.printEdu(); } } |
一般不喜欢调用父类的成员变量,因而调用成员变量就不介绍了。
使用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 |
补充:Jsp教程,Java基础