package cm.aff.abst; /* abstract:抽象的,,可以修飾類,方法 1.修飾類: 抽象類: ①不能被實例化 ②有構造器的 ③凡是類都有構造器 ④抽象方法所修飾的類一定是抽象類 ⑤抽象類中可以沒有抽象方法
⑥不能用abstract修飾屬性,私有方法,構造器,靜態方法,final的方法 2.修飾方法:抽象方法: ①格式:沒有方法體, 包括{ }.如: public abstract void eat(); ②抽象方法只保留方法的功能,而具體的執行,交給繼承抽象類的子類,由子類重寫此抽象方法 ③若子類繼承抽象類,並重寫了所有的抽象方法,則此類是一個 "實體類" ,即可以被實例化 ④若子類繼承抽象類,沒有重寫所有的抽象方法,意味着此類中仍有抽象方法,則此類必須聲明為抽象的 */ public class TestAbstract { public static void main(String[] args) { //Person p1 = new Person();//不能被實例化 //p1.eat(); Student s = new Student(); s.eat(); Person p = new Worker();//多態 p.eat(); } } abstract class Person { String name; public Person(){ } public Person(String name){ this.name = name; } public abstract void eat(); //方法中的語句不能被執行了,里面的語句不要了 //給他一個abstract標識,保留了功能,但沒有具體的實現, 得由子類來實現了 public abstract void walk() ; } class Student extends Person { public void eat() { System.out.println("學生吃飯"); } public void walk() { System.out.println("學會走路"); } } class Worker extends Person { public void eat() { System.out.println("工人吃飯"); } public void walk() { System.out.println("工人走路"); } }
輸出結果:
學生吃飯
工人吃飯
使用練習:
package cm.aff.abst; public class TestEmployee { public static void main(String[] args) { //Manager m = new Manager(); Employee e1 = new Manager();//使用多態 虛擬方法調用,和上面一樣效果 e1.work(); Employee e2 = new CommonEmployee(); e2.work(); } } abstract class Employee{ private String name; private int id ; private double salary; public abstract void work(); public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } } class Manager extends Employee{ private double bonus; public void work(){ System.out.println("監督工作,提高效率"); } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } } class CommonEmployee extends Employee{ public void work(){ System.out.println("流水線工作"); } }
輸出結果:
監督工作,提高效率
流水線工作