由于子类可以覆盖父类的实例方法、隐藏父类的类方法、隐藏父类的字段等,但是我们有时候需要引用到父类的一些方法,这时候需要借助关键字super.
1.使用super关键字访问父类中的成员.
1-1.调用父类中被覆盖的方法
示例:
public class Superclass {
public void printMethod() {
System.out.println("在Superclass中的输出。");
}
}
public class Subclass extends Superclass {
//重写超类Superclass中的printMethod方法
public void printMethod() {
super.printMethod(); //使用super关键字调用超类中的方法
System.out.println("在Subclass中的输出。");
}
}
public class ExtendsDemo7{
public static void main(String[] args) {
Subclass s = new Subclass();
s.printMethod();
}
}
输出结果:
在Superclass中的输出.
在Subclass中的输出.
1-2.访问父类中被隐藏的字段
示例:
// 父类A
class A{
public String name = "张小明";
}
// A的子类B
class B extends A{
public String name = "赵红丽";
public void self( ){
System.out.println("我的名字是:" + name);
System.out.println("我原来的名字是:" + super.name); //使用super访问超类中被隐藏的字段
}
}
// 主程序ExtendsDemo8
public class ExtendsDemo8{
public static void main(String[ ] args){
B b = new B( );
b.self( );
}
}
输出结果:
我的名字是: 赵红丽
我原来的名字是: 张小明
2.使用super关键字调用父类的构造器:
子类是不继承父类的构造器.因此,如果要初始化父类中的字段,可以在子类的构造器中,通过关键字super调用父类的构造器.对父类的构造器的调用必须放在子类的构造器的第一行.
示例:
// 父类A
class A{
A(){
System.out.println("这里是超类A的构造器。");
}
}
// A的子类B
class B extends A{
B(){
super();
System.out.println("这里是子类B的构造器。");
}
}
// 主程序ExtendsDemo9.java
public class ExtendsDemo9{
public static void main(String[] args) {
B b = new B();
}
}
输出结果:
这里是超类A的构造器.
这里是子类B的构造器.
3.构造器连
如果一个子类的构造器显式或隐式地调用其父类的一个构造器,而其父类会再显式或隐式地调用父类的父类的构造器.形成一个完整的构造器链.
示例:
class Book {
private String ISBN;
Book(String isbn){
this.ISBN = isbn;
}
public String getISBN(){
return this.ISBN;
}
public boolean equals(Object obj) {
if (obj instanceof Book)
return ISBN.equals(((Book)obj).getISBN());
else
return false;
}
}
public class ExtendsDemo11{
public static void main(String[] args) {
Book firstBook = new Book("0201914670");
Book secondBook = new Book("0201914670");
if (firstBook.equals(secondBook)) {
System.out.println("两个对象相等.");
} else {
System.out.println("两个对象不相等.");
}
}
}
输出结果:
这里是超类A的构造器.
这里是超类B的构造器.
这里是子类C的构造器.