由于子类可以覆盖父类的实例方法、隐藏父类的类方法、隐藏父类的字段等,但是我们有时候需要引用到父类的一些方法,这时候需要借助关键字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的构造器.