在java中,一個(gè)沒(méi)有方法體的方法應(yīng)該定義為抽象方法,而類(lèi)中如果有抽象方法,該類(lèi)必須定義為抽象類(lèi)
public abstract class Animal {
public abstract void eat();
}
抽象類(lèi)的特點(diǎn)
- 抽象類(lèi)和抽象方法必須使用
abstract
關(guān)鍵字修飾 - 抽象類(lèi)中不一定有抽象方法,有抽象方法的類(lèi)一定是抽象類(lèi)
- 抽象類(lèi)不能直接實(shí)例化,需要參照多態(tài)的方式,通過(guò)子類(lèi)對(duì)象實(shí)例化,這叫抽象類(lèi)多態(tài)
- 抽象類(lèi)的子類(lèi),要么重寫(xiě)抽象類(lèi)中的所有抽象方法,要么是抽象類(lèi)
抽象類(lèi)的成員特點(diǎn)
- 成員變量
- 可以是變量
- 也可以是常量
- 構(gòu)造方法
- 可以有構(gòu)造方法,但是不能實(shí)例化
- 該構(gòu)造方法用于子類(lèi)訪問(wèn)父類(lèi)數(shù)據(jù)的初始化
- 成員方法
- 可以有抽象方法: 限定子類(lèi)必須完成某些動(dòng)作
- 也可以有非抽象方法: 提高代碼復(fù)用性,由繼承來(lái)保證
案例: 貓和狗
public abstract class Animal {
private String name;
private int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("貓吃魚(yú)");
}
}
public class Dog extends Animal {
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃屎");
}
}
public static void main(String[] args) {
Animal a = new Cat();
a.setName("黑貓");
a.setAge(5);
System.out.println(a.getName() + "," + a.getAge() + "歲");
a.eat();
Animal a2 = new Cat("白貓",6);
System.out.println(a2.getName() + "," + a2.getAge() + "歲" );
a2.eat();
}