感觉实际工作中自己很少去使用super关键字写程序,所以对它的理解也不深。通常看的时候会去查查啥意思,但过段时间就立马忘记了,所以有段时间对super这个关键字产生了恐惧心理。这次写了几个例子,来加深对super关键字的理解。
super主要是用在以下三个方面
1.在子类的构造方法中,调用父类的构造方法。
这是java默认的,即使不写子类的构造方法,也同样会去执行父类构造方法。当然如果父类的构造方法也省略不写,则程序上不会输出任何结果。
2.在子类的成员方法中,调用父类的成员变量。
3.在子类的成员方法中,调用父类的成员方法。
可以根据下面的程序对上述三条进行理解和对比。
先定义一个父类
package superDemo;
public class Father {
String name="父类";
public Father(){
System.out.println("父类的构造方法");
}
public void show() {
System.out.println("这是一个父类");
}
}
再定义一个子类
package superDemo;
public class Son extends Father {
String name = "子类";
// 子类的构造方法
// 实际上,构造方法是自带的,并且默认不显示。
// 而如果该类继承了其他类,则该类的构造方法中,也自动添加了super()方法
public Son() {
//遇到super关键字,会先去执行父类的构造方法
super();
//执行完父类的构造方法后,再继续执行后面的语句
System.out.println("这是子类的构造方法");
}
public static void main(String[] args) {
//第一步:程序进入main方法后,先创建对象,对象创建完毕后,立即执行构造方法public Son()
Son son = new Son();
//第二步:执行完构造方法后,继续执行以下代码
son.showSon();
// 需要注意以下情况 在static关键字定义的方法里,不能直接用super调用父类方法。
// super.show(); 这是一个错误写法
}
// 注意 此时的方法不能为静态static类型,否则程序将报错,具体原因可以参照静态部分的知识。
public void showSon() {
// 子类显示自己的名字
System.out.println("显示子类的名字:" + name);
// 子类用super显示父类的名字
System.out.println("显示父类的名字:" + super.name);
// 子类用super显示父类的方法
super.show();
}
}
执行结果如下
父类的构造方法
这是子类的构造方法
显示子类的名字:子类
显示父类的名字:父类
这是一个父类
需要注意的是static和super这两个关键字,可谓水火不相容。在static方法体里,绝对不允许出现super调用的各种父类方法或父类变量。这一部分可以参考静态知识总结。