java學習(十二)——抽象類、抽象方法

抽象方法

概念:只有方法的聲明,沒有方法的實現。或者說是沒有方法體的的特殊方法。
什麼時候使用抽象方法呢?
        在程序設計中,有時候只需聲明類的功能,而不必指出其實現細節時,就可以使用抽象方法。
格式

           [修飾符] abstract <方法返回類型> 方法名(參數列表);
                  如: public abstract int getInt();

 注:空方法有方法體,但方法體裏沒有內容。而抽象方法只有方法的聲明,沒有方法體。並用abstract(不能省略)修飾,如
      
 public void show(){}    //是一個空方法
        public abstract void show();        //是一個抽象方法

抽象類

概念:用abstract 修飾的類稱爲抽象類,抽象類是它所有子類共同屬性的集合,是包含一個或者多個抽象方法的類

如果只想將一個類作爲派生其他類的基類,而不作爲想使用其特定實例的類,就可以使用抽象類。通常把通用的域和方法(不管是否抽象)放在抽象類中,通過它派生子類來實現其抽象方法

定義格式

    [修飾符] abstract class 類名
    {
        [成員變量聲明]
        [抽象方法的聲明]
        [非抽象方法的聲明]
    }

抽象類的 特點

  •     1.一旦用abstract 修飾的類就是抽象類,無論它內部是否含有抽象方法;
  •     2.抽象類中可以有零個或多個抽象方法,也可以有非抽象方法、構造器等;
  •     3.抽象類可以派生子類,子類必須實現了抽象類中所有的抽象方法,否則其子類也爲抽象類
  •     4.抽象類不能創建對象。但可以定義一個抽象類的對象變量,該對象變量只能引用非抽象子類的對象。
  •     5.abstract不能與final修飾同一個類或方法。
  •     6.在抽象類的派生類中實現抽象方法時,方法的訪問權限不能低於其抽象父類抽象方法的訪問權限

抽象類的構造器:抽象類既然不能創建對象,那麼定義抽象類的構造器有什麼作用呢?

通常將一個類中的實例域都定義爲private類型,方法定義爲public。抽象類派生出的子類並不能訪問其抽象父類私有的實例域,此時就可以通過子類的構造器調用父類的構造器來初始化父類私有的實例域

//class Animal		//error:Animal不是抽象的,並且未覆蓋Animal中的抽象方法eat();
//abstract final class Animal		//error:非法的修飾符組合:abstract和final
abstract class Animal
{
	//通用的域
	private String name;
	
	//抽象類的構造器
	public Animal(){
	}
	public Animal(String name)
	{
		this.name=name;
	}

	//抽象方法
	//public abstract void eat(){}		//error:抽象方法不能有主體
	//public void eat();		//error:缺少方法主體,或聲明抽象
	public abstract void eat();
	public abstract void sleep();

	//通用的方法
	public String getName(){
		return name;
	}
}

//該類實現了抽象父類的所有抽象方法,所以該類可以是非抽象類
class Cat extends Animal
{

	public Cat()
	{
	
	}
	public Cat(String name)
	{
		super(name);
	}

	public void eat()
	{
		System.out.println("貓吃老鼠");
	}
	public void sleep()
	{
		System.out.println("貓在睡覺");
	}
}
class Dog extends Animal		
{
	public void eat()
	{
		System.out.println("狗啃骨頭");
	}
	public void sleep()
	{
		System.out.println("狗在睡覺");
	}
	public void playGame()
	{
		System.out.println("狗在玩遊戲");
	}
}

//class Pig extends Animal	//error:Pig不是抽象的,並且未覆蓋Animal中的抽象方法
abstract class Pig extends Animal
{
	public void eat()
	{
		System.out.println("豬吃白菜");
	}
}

 使用抽象類還可以實現 多態,如下述的示例程序

class AbstractDemo
{
	public static void main(String[] args)
	{
		
		//Animal a=new Animal();	//error:Animal是抽象的;無法實例化
		
		//利用抽象類實現多態
		Animal a=new Cat("小白");
		a.eat();
		a.sleep();
		System.out.println(a.getName());

		System.out.println("------------");
		a=new Dog();
		a.eat();
		a.sleep();

		if(a instanceof Dog)
		{
			System.out.println("------------");
			Dog b=(Dog)a;
			b.eat();
			b.playGame();		//子類特有的方法
		}
	}
}

 運行結果

 

 

多態的其它實現方式

返回目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章