1. 程式人生 > >Java的抽象類詳解

Java的抽象類詳解

一、抽象類概述

        舉一個貓狗案例,提取出了一個動物類。但只有看到了具體的動物,我們才知道,這是什麼動物。 所以說,動物本身並不是一個具體的事物,而是一個抽象的事物。只有真正的貓、狗才是具體的動物。同理,我們也可以推想,不同的動物吃的東西應該是不一樣的,所以,我們不應該在動物類中給出具體體現,而是應該給出一個宣告即可。

        把多個共性的東西提取到一個類中,這是繼承的做法。但是,這多個共性的東西在有些時候,方法宣告一樣,但是方法體(每個具體的物件在具體實現時候的內容)不一樣。所以,我們在定義這些共性的方法的時候,就不能給出具體的方法體。而一個沒有具體的方法體的方法是抽象的方法。

        在Java中,一個沒有方法體的方法應該定義為抽象方法,而類中如果有抽象方法,該類必須定義為抽象類。

二、抽象類特點

        1、抽象類和抽象方法必須用abstract關鍵字修飾

格式:

abstract class 類名 {}

public abstract void eat();

        2、抽象類不一定有抽象方法,有抽象方法的類一定是抽象類

        3、抽象類不能例項化

如果想例項化,應按照多型的方式,由具體的子類例項化。其實這也是多型的一種,抽象類多型。

        4、抽象類的子類

        可以是一個抽象類;

        可以是一個具體類,但需要重寫抽象類中的所有抽象方法。


三、抽象類的成員特點

1、成員變數

可以是變數
也可以是常量

2、構造方法

有構造方法,但是不能例項化。所以構造方法存在的作用是用於子類訪問父類資料的初始化

3、成員方法

可以有抽象方法,限定子類必須完成某些動作

也可以有非抽象方法,提高程式碼複用性

四、需要注意幾個問題

1、一個類如果沒有抽象方法,可不可以定義為抽象類?如果可以,有什麼意義?

可以定義為抽象類,為了不讓建立物件。

2、abstract不能和哪些關鍵字共存?

private衝突

final衝突

static無意義

五、例項說明

/*
	動物不應該定義為具體的東西,而且動物中的吃,睡等也不應該是具體的。
	我們把一個不是具體的功能稱為抽象的功能,而一個類中如果有抽象的功能,該類必須是抽象類。
		
	抽象類的例項化其實是靠具體的子類實現的。是多型的方式。
		Animal a = new Cat();
*/

//抽象類的宣告格式
abstract class Animal {
	private String name;
	private int age;
	
	public Animal(){}
	public Animal(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}
	
	//抽象方法
	//public abstract void eat(){} //空方法體,這個會報錯。抽象方法不能有主體
	public abstract void eat();
}

//子類是抽象類
abstract class Dog extends Animal {}

//子類是具體類,重寫抽象方法
class Cat extends Animal {
	public Catt(){}
	public Catt(String name,int age){
		super(name, age);
	}
	public void eat() {
		System.out.println("貓吃魚");
	}
}

class AbstractDemo {
	public static void main(String[] args) {
		//建立物件
		//Animal a = new Animal();//錯誤,Animal是抽象的; 無法例項化
		//通過多型的方式
		Animal a = new Cat();
		a.eat();
	}
}