1. 程式人生 > >Java類和物件(四)

Java類和物件(四)

抽象類和抽象方法

1. 抽象類

在 Java 面向物件當中,所有的物件都是用過類進行描繪的,但是並不是所有的類都是用來描繪物件的,如果一個類中沒有包含足夠的資訊來描繪一個具體的物件,我們把這種類定義為抽象類

抽象類的特徵

  1. 抽象類不能用來例項化物件,所以抽象類必須被繼承才能夠被使用,其他的功能和普通類相同。
  2. 一個類只能繼承一個抽象類。
  3. 抽象類的修飾符不能是 private。

2. 抽象方法

如果想要設計一個類,該類包含一個特別的成員方法,該方法是根據子類的行為來確定的,那麼在父類中將這個方法宣告為抽象方法。繼而含有抽象方法的類稱為抽象類。

抽象方法的注意點:

  1. 抽象類中不一定含有抽象方法,但是有抽象方法的類一定是抽象類。
  2. 構造方法,類方法(static 修飾的方法)不能宣告為抽象方法。
  3. 抽象類的子類必須給出抽象類中抽象方法的實現,除非該子類也是一個抽象類。
  4. 抽象方法的修飾符不能是 private。
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 void mailCheck(){
      System.out.println("mailing a check to" + this.name+" "+this.address);
   }
   public void setAddress(String newaddress){
      address=newaddress;
   }
   public abstract void fun();  //定義抽象方法
}
class ExtendsEmployee extends Employee{  //繼承抽象類必須實現抽象方法
   public ExtendsEmployee(String name, String address, int number) {
       super(name, address, number);
   }
   @Override
   public void fun() {  //抽象方法的實現
      System.out.println("fun()");
   }
}
public class TestDemo{
   public static void main(String[] args){
      //Employee e=new Employee("lisi","xian",123);  //error 不能用抽象類例項化物件
      ExtendsEmployee e = new ExtendsEmployee("lisi","xian",123); 
      e.fun();
   }
}

介面

在抽象類中,可以包含一個或多個抽象方法,但是在介面中,所有的方法必須是抽象的,不能有方法體,他比抽象類更加的抽象。介面規定一個類必須做什麼而不規定他如何去做。
介面中的成員變數預設都是 public static final 的,必須顯示的初始化。因而在常量宣告時可以省略這些修飾符。是若干常量和抽象方法的集合。

介面有以下特性:

  1. 介面中只定義抽象方法,這些方法預設都是 public abstract 的,在方法宣告時可以省略這些修飾符。
  2. 在介面中定義例項變數,非抽象例項方法以及靜態方法都是不允許的。
  3. 介面中沒有構造方法,也不能被例項化。
  4. 一個介面不能實現另一個介面,但是可以多繼承其他介面。

介面的使用:

  1. 介面的使用與類的使用有些不同,在需要使用類的地方,會直接進行 new 關鍵字來建立一個類的例項,但是介面不行。
  2. 介面必須通過類來實現他的抽象方法。介面必須通過類來實現他的抽象方法。
  3. 如果一個類不能實現完介面中的抽象方法,那麼這個類我們應該設計為抽象類。
  4. 不允許建立介面的例項,但是允許定義介面型別的引用變數引用實現該介面的類的例項。
interface InterfaceClass{
   int a=10;  //只能是 public static final 進行修飾介面變數,必須初始化
   void fun();  //預設的修飾符是 public abstract,不能用其他修飾符進行修飾操作
}
class AchieveInterface implements InterfaceClass{
   @Override
   public void fun() {
      // TODO Auto-generated method stub
   }
}

多型

多型包括靜多型動多型

1. 靜多型(編譯時多型)

靜多型也稱編譯時的多型,就是我們所說的方法過載。相同的函式名,根據形參型別個數的不同調用不同的方法。在編譯期間就已經確定要呼叫的方法。

2. 動多型(執行時多型)

發生動多型的三個條件:

  1. 繼承
  2. 方法的重寫
  3. 父類引用派生類物件(向上造型)

向上造型就是定義父類的引用,引用派生類的物件。例,
Animal animal=new Cat();
animal 引用.出來的方法是父類的方法介面,但是方法的實現卻是子類的實現方式。

public class TestDemo1 {
    public static void main(String[] args){
        Moyu1 moyu1 = new Moyu2();
        Moyu1 moyu11 = new Moyu1();
        moyu1.change();
        moyu11.change();
        ((Moyu2) moyu1).dayin();
    }
}
public class Moyu1 {
    private int a;
    public void change(){
        System.out.println("父類");
    }
}
public class Moyu2 extends Moyu1 {
    @Override
    public void change(){
        System.out.println("子類");
    }
    public void dayin(){
        System.out.println("哈哈");
    }
}
//結果:
子類
父類
哈哈