天天看點

abstract 抽象與interface 接口

abstract 抽象

當多個類中出現相同功能(方法),但是功能主體不同。

這時可以進行向上抽取(建立父類),這時,隻抽取功能定義,而不抽取功能主體。

其實就是子類重寫父類的方法,隻不過此時父類的方法是沒有方法體的,定義為抽象方法,此時父類為抽象類。要求子類必須重寫父類的抽象方法。不同子類實作父類的抽象方法又展現了多态。

※ abstract修飾符

可以修飾類和成員方法

修飾的類叫抽象類,修飾的方法叫抽象方法

※抽象類

. 用abstract修飾的類表示抽象類,抽象類不能執行個體化,(因為具有不确定的抽象方法)即不允許建立抽象類本身的執行個體。沒有用abstract修飾的類稱為具體類,具體類可以被執行個體化。

· 抽象類和一般類沒有什麼太大的不同。該如何描述事物,就如何描述事物,隻不過,該事物出現了一些看不懂的東西。這些不确定的部分,也是該事物的功能,需要明确出現,但是無法定義主體,通過抽象方法來表示。

※抽象類的特點:

1.抽象方法一定在抽象類中;

2.抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象;

3.抽象方法和抽象類都必須被abstract關鍵字修飾;

4.抽象類不可以被new建立對象,因為調用抽象方法沒意義;

5.抽象類中的抽象方法要被使用時,必須由子類複寫所有的抽象方法後,建立子類對象調用;

6.如果子類隻覆寫了部分抽象方法,那麼該子類還是一個抽象類,類名還要用用abstract修飾。

※抽象方法

. 用abstract修飾的方法表示抽象方法,抽象方法沒有方法體。抽象方法用來描述系統具有什麼功能,但不提供具體的實作。

注:沒有abstract修飾的方法稱為具體方法,具體方法具有方法體。

文法規則;

1) 抽象類中可以沒有抽象方法,但包含了抽象方法的類必須被定義為抽象類;

2) 沒有抽象構造方法,也沒有抽象靜态方法;

3) 抽象類中可以有非抽象的構造方法;

4) 抽象類及抽象方法不能被final修飾符修飾;

5)抽象類不能被執行個體化。

package angel;
        //定義抽象類
public abstract class Student
        {
        //定義抽象方法
         public abstract void study();
         public void sleep()
            {
            System.out.println("sleep");
          }
       }



class BaseStudent extends Student
       {
       public void study()
        {
       System.out.println("Study base");
              }
         }
//如果Student類中有另一抽象方法,而該類隻重寫了一條,則該類還是抽象類
           

interface 接口

一個抽象類中的所有方法都是抽象方法時,可以将該類定義成接口。(即抽象類的極緻)

class用于定義類

interface 用于定義接口

implements 用于實作接口

接口與接口之間是extends繼承關系

※接口使用的目的:

解決多重繼承問題:例如Fish類繼承Animal類,表明Fish是一種動物,但魚同樣也是一種食物,如何表示這種關系呢? 由于Java語言不支援一個類有多個直接的父類,是以無法用繼承關系來描述魚既是一種食物,又是一種動物,為了解決這一問題,Java語言引入接口類型,簡稱接口。一個類隻能有一個直接的父類,但是可以實作多個接口。 采用這種方式,Java語言對多繼承提供了有力的支援。

1.接口是抽象類的另外一種形式

抽象類抽象到極緻就是接口,抽象類可存在有方法體的方法,接口中的方法全部為抽象方法;

2.接口中的所有方法均是抽象方法, 預設都是public、abstract類型的;

public interface A {
     //合法,預設為public、abstract類型
             void method1();                    
     //合法,顯示聲明為public、abstract類型
            public abstract void method2();
           }
           

3.接口中的成員變量預設都是public, static, final類型,必須被顯式初始化;

public interface A {
  //合法,CONST預設為public, static, final類型
            int CONST = ; 
  //合法,顯示聲明為public static final 類型                
      public static final int OPAQUE = ;  
               }
           

4.接口中隻能包含public, static, final類型成員變量和public、abstract類型的成員方法;

5.接口中沒有構造方法,不能被執行個體化。需要被子類實作,子類對接口中的抽象方法全部覆寫後,子類才可以執行個體化。否則子類是一個抽象類。

6.一個類隻能繼承一個直接的父類,但能實作多個接口。

※ 接口的特點:

1.接口是對外暴露的規則

2.接口是程式的功能擴充

3.接口可以用來多實作

4.類與接口之間是實作關系,而且類可以繼承一個類的同時實作多個接口

5.接口與接口之間可以有繼承關系

抽象類和接口比較:

1.相同點:

a. 都不能被執行個體化;

b. 都能包含抽象方法;

2.不同點;

a. 抽象類中可以為部分方法提供預設的實作,進而避免子類中重複實作它們,提高代碼的可重用性,而接口中隻能包含抽象方法;

b. 一個類隻能繼承一個直接的父類,這個父類有可能是抽象類;但一個類可以實作多個接口,這是接口的優勢所在。

package angel;
//定義一個接口
interface Inter
{
public static final int X=;
public abstract void show();
}



public class test implements Inter
     {
      public void show()
       {}
    }
public class InterfaceDemo {
    public static void main(String[] args) {
// TODO Auto-generated method stub
         test t=new test();
        //列印輸出靜态變量 類名.屬性名
       System.out.println(Inter.X);
        //列印輸出對象.屬性名
       System.out.println(t.X);
        //繼承接口靜态屬性
       System.out.println(test.X);
}
}



package angel;
interface A 
      {
public abstract void show();
   }
interface B
      {
public abstract void show2();
   }
interface C extends A,B
      {
      //接口C繼承A,B的抽象方法,仍寫成抽象方法
       //public abstract void show();
       //public abstract void show2();
     }

class D implements A,B
    {
    //重寫抽象方法
      public void show(){}
      public void show2(){}
     }

class E extends D implements A,B
{
   //E繼承D 實作A,B接口
}
public class InterfaceDemo3 {
      public static void main(String[] args) {
// TODO Auto-generated method stub
      E e=new E();
    }
}