一、抽象類聲明格式:abstract class xx
二、抽象類特點:1.被abstract修飾
2.抽象類中不一定有抽象方法,但有抽象方法一定是抽象類
abstract class A{
public void B(){}
public abstract void B(){} //編譯報錯,抽象方法不能有方法體
public abstract void B(); //正確寫法
}//可以編譯
class A{
public abstract void B();
}//編譯報錯,有抽象方法必是抽象類
3.抽象類的實例化a:抽象類不能直接實例化
abstract class A{}
class abstractDemo{
public static void main(String[] args){
A a=new A();//出錯
}
}
b:抽象類可以通過多態的方式實例化
abstract class A{}
class B extends A{}
class abstractDemo{
public static void main(String[] args){
A a=new B();//多態向上轉型
}
}
4.抽象類子類
a:抽象類子類也應是一個抽象類(不重寫抽象方法)
abstract class A{}
abstract class B extends A{}
b:子類不是抽象類,是具體的類(應該重寫抽象方法)
abstract class A{
public abstract void a{}
}
class B extends A{
public void a{
syso("重寫抽象方法");
}
}
三、抽象類的成員特點:
1.成員變量:
既可以是變量也可以是常量
abstract class A{
public int num=10;
public final int num2=20;
}
class B extends A{}
class abstractDemo{
public static void main(String[] args){
syso(num+" "+num2);//輸出10 20
}
}
2.構造方法:有
用來子類訪問父類數據初始化
3.成員方法:
抽象方法:強制要求子類做的事情
普通成員方法:子類繼承的事情,提高代碼複用性
abstract class Person{
public abstract void breath();//每人都要呼吸,即強制子類做事。
public void eat(){
syso("喫飯");
}//提高代碼複用性
}
class Student extends Person{
public void breath(){
syso("需要呼吸")
}
}
class Teacher extends Person{
public void breath(){
syso("需要呼吸")
}
}
四、抽象類練習員工案例
/*
假如我們在開發一個系統時需要對員工類進行設計,員工包含3個屬性:姓名、工號以及工資。
經理也是員工,除了含有員工的屬性外,另爲還有一個獎金屬性。
請使用繼承的思想設計出員工類和經理類。要求類中提供必要的方法進行屬性訪問。
分析:
普通員工類
成員變量:姓名、工號以及工資。
成員方法:工作
經理類:
成員變量:姓名、工號以及工資,獎金屬性
成員方法:工作
實現:
員工類:
職員類:
經理類:
*/
//員工類
abstract class Employee{
//成員屬性姓名,員工號,工資
private String name;
private int employeeid;
private double salary;
public Employee() {}
public Employee(String name,int employeeid,double salary) {
this.name=name;
this.employeeid=employeeid;
this.salary=salary;
}
//抽象方法工作
public abstract void work();
public void show() {
System.out.println("姓名:"+name+" 職員號 :"+employeeid+" 薪水:"+salary);
}
}
//職工類
class Worker extends Employee{
public Worker() {}
public Worker(String name,int employeeid,double salary) {
super(name,employeeid,salary);
}
public void work() {
System.out.println("職員做基層工作");
}
}
//經理類
class Manager extends Employee{
//特有屬性獎金
private double bonus;
public Manager() {}
public Manager(String name,int employeeid,double salary,double bonus) {
super(name,employeeid,salary);
this.bonus=bonus;
}
public void work() {
System.out.println("經理做管理工作");
}
//特有方法
public void getBonus() {
System.out.println("獎金:"+bonus);
}
}
class Test{
public static void main(String[] args){
//普通員工,用多態
Employee worker=new Worker("Mike",3,4000);
worker.show();
worker.work();
System.out.println("---------------------");
//測試經理,自己調用,因爲有特有方法
Manager manager=new Manager("Jike",1,8000,2000);
manager.show();
manager.getBonus();
manager.work();
}
}