关键字super的作用意义

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


 

你可能感兴趣的:(关键字super的作用意义)