1. 程式人生 > >Java學習筆記之繼承(2)

Java學習筆記之繼承(2)

1、子類物件例項化過程

在繼承操作中,例項化子類物件的時候,會先呼叫父類的構造方法,然後再呼叫本類的構造方法。

class Person{
    private String name;
    private int age;
    public Person(){
        System.out.println("父類構造方法");
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
} public String getName() { return name; } public void setName(String name) { this.name = name; } } class Student extends Person{ private String school; public Student(){ // super(); 預設隱藏了呼叫父類構造方法的super方法 System.out.println("子類構造方法"); }
public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } } public class InstanceDemo { public static void main(String[] args) { Student stu = new Student(); stu.setName("張三"); stu.setAge
(18); stu.setSchool("NanKai"); System.out.println("姓名:" + stu.getName() + " 年齡:" + stu.getAge() + " 學校:" + stu.getSchool() ); } } // 執行結果: 父類構造方法 子類構造方法 姓名:張三 年齡:18 學校:NanKai

2、方法的覆寫

所謂方法的覆寫就是子類裡定義了和父類一樣名稱的方法,但是子類同名方法的許可權不能擁有比父類方法更加嚴格的訪問許可權。訪問許可權有三種,private, default, public。
比如父類一個方法的訪問許可權是public,那麼子類覆寫該方法的許可權只能是public,否則編譯會報錯。

class Person{
	void print(){
		System.out.println("Person --> void print()");
	}
}

class Student extends Person{
	public void print(){
		System.out.println("Student --> void print()");
	}
}
public class OverrideDemo{
	public static void main(String args[]){
		Student s = new Student();
		s.print();
	}
}

// 執行結果
Student --> void print()

如果想要呼叫父類的方法該怎麼辦?我們可以用super關鍵字

class Person{
	void print(){
		System.out.println("Person --> void print()");
	}
}

class Student extends Person{
	public void print(){
		super.print();
		System.out.println("Student --> void print()");
	}
}
public class OverrideDemo{
	public static void main(String args[]){
		Student s = new Student();
		s.print();
	}
}

// 執行結果
Person --> void print()
Student --> void print()

如果將父類的方法設定為private訪問許可權,子類覆寫的方法設定為default許可權,是否可以繼承呢?

class Person1{
    private void print(){
        System.out.println("父類print方法");
    }
    public void fun(){
        this.print();
    }
}

class Student1 extends Person1{
    void print(){
        System.out.println("子類print方法");
    }
}

public class OverrideDemo {
    public static void main(String[] args) {
        Student1 s = new Student1();
        s.fun();
    }
}

// 執行結果:
父類print方法

可以看到,子類覆寫了父類的print方法,子類例項化物件呼叫父類的fun方法,而fun方法的功能是呼叫print方法,但是由於父類否print方法是private訪問許可權,因此子類所謂的覆寫其實並沒有覆寫,而是相當於在子類裡又重新定義了一個方法。

3、覆寫和過載的區別

在這裡插入圖片描述

4、super關鍵字

super表示的是從子類呼叫父類的指定操作,例如呼叫屬性,方法,構造等。而子類在例項化物件的時候會先呼叫父類無參的構造方法,如果希望呼叫有參的構造方法,則必須在子類中宣告

class Person1{
	private String name;
	private int age;
	public Person1(String name,int age){
		this.setName(name);
		this.setAge(age);
	}
	// setter & getter 方法
}

class Student1 extends Person1{
    private String school;
    public Student1(String name,int age,String school){
    	super(name,age); // 明確呼叫父類中有兩個引數的構造
    	this.school = school;
    }
	// setter & getter 方法
}

public class OverrideDemo {
    public static void main(String[] args) {
        Student1 s = new Student1("張三",20,"Tsing U");
    }
}

this 和 super關鍵字的區別
在這裡插入圖片描述