什么是抽象類汹粤?
在面向對象的概念中虫腋,所有的對象都是通過類來描繪的,但是反過來妥畏,并不是所有的類都是用來描繪對象的邦邦,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類醉蚁。
抽象類除了不能實例化對象之外燃辖,類的其它功能依然存在,成員變量馍管、成員方法和構造方法的訪問方式和普通類一樣郭赐。
由于抽象類不能實例化對象,所以抽象類必須被繼承确沸,才能被使用捌锭。也是因為這個原因,通常在設計階段決定要不要設計抽象類罗捎。
父類包含了子類集合的常見的方法观谦,但是由于父類本身是抽象的,所以不能使用這些方法桨菜。
在Java中抽象類表示的是一種繼承關系豁状,一個類只能繼承一個抽象類捉偏,而一個類卻可以實現(xiàn)多個接口。
1.抽象類
在Java語言中使用abstract class來定義抽象類:
public class JavaAbstract {
public static void main(String[] args) {
}
}
abstract class Employee {
private String name;
private String address;
private int number;
public Employee(String name,String address,int number) {
this.name = name;
this.address = address;
this.number = number;
}
public double computePay() {
System.out.println("Inside Employee computePay");
return 0.0;
}
public void mailCheck() {
System.out.println("Mailing a check to " + this.name
+ " " + this.address);
}
public String toString() {
return name + " " + address + " " + number;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public int getNumber() {
return number;
}
}
以上Employee類和普通類并沒有什么不同泻红,它有自己的成員變量夭禽,構造方法,成員方法谊路,但是若對Employee類進行如下對象初始化是不允許的:
Employee e = new Employee("Bob","China",213);
2.繼承抽象類
雖然不能直接對抽象類進行初始化對象讹躯,但是可以通過對抽象類的繼承來初始化對象。
public class JavaAbstract {
public static void main(String[] args) {
//不允許對抽象類進行初始化
// Employee e = new Employee("Bob","China",213);
BaiduEmployee baiduE = new BaiduEmployee("baidu", "shenzhen", 100, 100000);
System.out.println(baiduE.toString());
baiduE.mailCheck();
Employee e = new BaiduEmployee("Employee", "China", 101, 200000);
System.out.println(e.toString());
e.mailCheck();
}
}
class BaiduEmployee extends Employee {
private double salary;
public BaiduEmployee(String name, String address, int number,double salary) {
super(name, address, number);
setSalary(salary);
}
public void mailCheck() {
System.out.println("Within mailCheck of BaiduEmployee class ");
System.out.println("Mailing check to " + getName()
+ " with salary " + salary);
}
public double getSalary() {
return salary;
}
public void setSalary(double newSalary) {
if (newSalary >= 0.0) {
salary = newSalary;
}
}
public double computePay() {
System.out.println("Computing BaiduEmployee pay for " + getName());
return salary/52;
}
}
abstract class Employee {
private String name;
private String address;
private int number;
public Employee(String name,String address,int number) {
this.name = name;
this.address = address;
this.number = number;
}
public double computePay() {
System.out.println("Inside Employee computePay");
return 0.0;
}
public void mailCheck() {
System.out.println("Mailing a check to " + this.name
+ " " + this.address);
}
public String toString() {
return name + " " + address + " " + number;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public int getNumber() {
return number;
}
}
3.抽象方法
如果想設計一個類缠劝,該類包含一個特別的成員方法潮梯,該方法的具體實現(xiàn)由它的子類確定,那么可以在父類中聲明該方法為抽象方法惨恭。
abstract class AbstractFunctionClass {
//抽象方法
public abstract void eat();
}
class SubAbstractFunctionClass extends AbstractFunctionClass {
@Override
public void eat() {
System.out.println("SubClass eat");
}
}
聲明抽象方法會造成以下兩個結果:
1.如果一個類包含抽象方法秉馏,那么該類必須是抽象類。
2.任何子類必須重寫父類的抽象方法脱羡,或者聲明自身為抽象類萝究。
4.總結
抽象類不能被實例化,如果被實例化锉罐,就會報錯糊肤,編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對象氓鄙。
抽象類中不一定包含抽象方法馆揉,但是有抽象方法的類必定是抽象類。
抽象類中的抽象方法只是聲明抖拦,不包含方法體升酣,就是不給出方法的具體實現(xiàn)也就是方法的具體功能。
構造方法态罪,類方法(用 static 修飾的方法)不能聲明為抽象方法噩茄。
抽象類的子類必須給出抽象類中的抽象方法的具體實現(xiàn),除非該子類也是抽象類复颈。