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:對本包和所有子類可見。
對本包可見,默認不需要修飾符。