CoreJava(第五章)繼承-02

5.1.5多態

01-描述

子類的每個對象也是父類的對象。

例,將子類對象賦給父類變量。

Employee e;	// 父類

e = new Manager();	// 將子類的對象賦給父類變量。

反之則不能將父類引用賦給子類變量。

在這裏插入圖片描述

5.1.6方法調用

5.1.7final類和方法

01-描述

不允許被擴展的類稱爲final類,加了final修飾符,就說明這個類是final類。

將父類裏面的方法聲明爲final,則子類就不能修改這個方法。

父類中的getName被聲明爲final後:

public final String getName() {
		return name;
	}

我們只能在子類中訪問這個方法,不能修改這個方法,否則會出現錯誤。

02-目的

將方法或類聲明爲final的主要目的是:確保不會被修改。

5.1.8強制類型轉換

01-定義

將一個類型強制轉換成另一個類型的過程被稱爲類型轉換。

我們將子類的引用賦給一個父類對象,是被允許的,反之,如果將一個父類的引用賦給一個子類變量,必須進行強制轉換。

Manager m = (Manager) e;	// 將父類Employee轉換成子類Manager,需要進行類型轉換
Employee q = m;	// 將子類Manager轉換成父類Employee,則不需要進行類型轉換

5.·9抽象類

我們拿Person人和Student學生、僱員Employee進行舉例說明。

01-定義

包含一個或多個抽象方法的類本身必須被聲明爲抽象的。

如果我們不清楚Person裏面應該提供的內容,可以先返回一個字符串。我們可以使用abstract關鍵字,這樣完全就不需要實現這個方法了。

public abstract class Person {
	
	public abstract String getDescription();

}

02-擴展抽象類

1.在抽象類中定義部分抽象類方法或不定義抽象類方法,這樣必須將子類也標記爲抽象類。

2.定義全部的抽象方法,這樣一來,子類就不是抽象的了。

03-代碼

Person:抽象類

package com.eleven.duotai;

/**
 * 定義了抽象類person
 * @author eleven
 *
 */
public abstract class Person {

	public abstract String getDescription();

	private String name;

	// 構造方法
	public Person(String name) {
		super();
		this.name = name;
	}

	// get方法
	public String getName() {
		return name;
	}
}

Student:具體子類

package com.eleven.duotai;
/**
 * 具體子類Student和Employee
 * @author eleven
 *
 */
public class Student extends Person{
	private String major;	// 專業

	public Student(String name,String major) {
		super(name);
		this.major = major;
	}
	
	public String getDescription() {
		return "學生主要學習" + major;
	}

}

Employee:具體子類

package com.eleven.duotai;

import java.time.LocalDate;

public class Employee extends Person{

	private double salary;
	private LocalDate hireDay;
	// get方法
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public LocalDate getHireDay() {
		return hireDay;
	}
	public void setHireDay(LocalDate hireDay) {
		this.hireDay = hireDay;
	}
	// 構造方法
	public Employee(String name,double salary,int year,int month,int day) {
		super(name);
		this.salary = salary;
		hireDay = LocalDate.of(year, month, day);
	}
	// 描述方法
	public String getDescription() {
		return String.format("員工的工資爲$%.2f", salary);
	}
	
	public void raiseSalary(double byPercent) {
		double raise = salary * byPercent / 100;
		salary +=raise;
	}	
}

PersonTest:

package com.eleven.duotai;

public class PersonTest {
	public static void main(String[] args) {
		// 創建一個person數組
		Person[] p = new Person[2];
		// 引用子類的對象
		p[0] = new Employee("李四",5000,2000,12,12);
		p[1] = new Student("李四", "計算機科學與技術");
		// 循環輸出
		for (Person people : p) {
			System.out.println(people.getName() + "," + people.getDescription());
		}
	}
}

5.10受保護訪問

類中的域標記爲private,方法標記爲public。

因爲子類不能夠訪問父類中的私有域,爲了能夠讓子類訪問父類的方法或者是父類的某個域,我們可以聲明爲proteced,這樣子類就可以直接訪問它了。

private:僅對本類可見。

public:對所有類可見。

proteced:對本包和所有子類可見。

對本包可見,默認不需要修飾符。

發佈了92 篇原創文章 · 獲贊 285 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章