-
super一般出现在子类构造器中.super作为一个关键字是不能够给其它对象赋值的.它只是一个指示编译器调用超类方法的关键字.
-
super主要有两个作用,一是调用超类的构造器,二是调用超类方法.(super调用构造器必须是子类构造器的第一句)
1.super超类的构造器
我们首先要知道,如果子类的构造器没有显式地调用父类的构造器,那么Java编译器会自动帮我们加上一个无参的父类构造器.
package com.jss;
public class SuperTest {
public static void main(String[] args) {
System.out.println("输出结果");
new Son();
}
}
class Father {
Father(){
System.out.println("Father");
}
}
class Son extends Father{
Son(){
super();//如果没有,Java编译器会自动加上
System.out.println("Son");
}
}
那么如果父类构造器有参数呢?
因为子类可以增加域,增加方法,也可以覆盖父类的方法,但是不能够删除继承的任何域和方法.
所以还是要调用super(a,b)先把参数传给父类构造器,再写另外的.
package com.jss;
public class SuperTest {
public static void main(String[] args) {
System.out.println("输出结果");
new Son(1,2);
}
}
class Father {
int a ;
Father(){
System.out.println("Father");
}
Father(int a){
this.a = a;
System.out.println("Father "+a);
}
}
class Son extends Father{
int b;
Son(){
super();//如果没有,Java编译器会自动加上
System.out.println("Son");
}
Son(int a, int b){
//super(); a 将会没有值
super(a);
this.b=b;
System.out.println("Son "+a+":"+b);
}
}
如果子类执行的是super()那么父类的a将会是0,int的默认值.
2.调用超类方法
此时super的位置无所谓了
package com.jss;
public class SuperTest2 {
public static void main(String[] args) {
Father son = new Son();
son.print();
}
}
class Father {
public void print() {
System.out.println("Father print()");
}
}
class Son extends Father{
public void print() {
super.print();//想要调用父类的print()
System.out.println("Son print()");
}
}
最后分享一道题目,算是对super的一个练习,问下面代码的输出结果
package com.jss;
public class SeqTest {
public static void main(String[] args) {
new Son();
}
}
class Father {
public Father(){
System.out.println("Father Consturtor");
};
{
System.out.println("Father Code");
}
static {
System.out.println("Father Static Code");
}
}
class Son extends Father{
public Son(){
System.out.println("Son Consturtor");
};
{
System.out.println("Son Code");
}
static {
System.out.println("Son Static Code");
}
}
我个人认为的原因是,Son()中Java编译器给加上了一句super();
这样的话,相当于 new Father() 了;因为一执行实例化,必须先加载类,自然 首先 执行static{}中的内容,其次会执行{}的内容.最后执行构造器
所以会产生上述结果.