Java類和物件(四)
阿新 • • 發佈:2018-12-09
抽象類和抽象方法
1. 抽象類
在 Java 面向物件當中,所有的物件都是用過類進行描繪的,但是並不是所有的類都是用來描繪物件的,如果一個類中沒有包含足夠的資訊來描繪一個具體的物件,我們把這種類定義為抽象類。
抽象類的特徵:
- 抽象類不能用來例項化物件,所以抽象類必須被繼承才能夠被使用,其他的功能和普通類相同。
- 一個類只能繼承一個抽象類。
- 抽象類的修飾符不能是 private。
2. 抽象方法
如果想要設計一個類,該類包含一個特別的成員方法,該方法是根據子類的行為來確定的,那麼在父類中將這個方法宣告為抽象方法。繼而含有抽象方法的類稱為抽象類。
抽象方法的注意點:
- 抽象類中不一定含有抽象方法,但是有抽象方法的類一定是抽象類。
- 構造方法,類方法(static 修飾的方法)不能宣告為抽象方法。
- 抽象類的子類必須給出抽象類中抽象方法的實現,除非該子類也是一個抽象類。
- 抽象方法的修飾符不能是 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 的,必須顯示的初始化。因而在常量宣告時可以省略這些修飾符。是若干常量和抽象方法的集合。
介面有以下特性:
- 介面中只定義抽象方法,這些方法預設都是 public abstract 的,在方法宣告時可以省略這些修飾符。
- 在介面中定義例項變數,非抽象例項方法以及靜態方法都是不允許的。
- 介面中沒有構造方法,也不能被例項化。
- 一個介面不能實現另一個介面,但是可以多繼承其他介面。
介面的使用:
- 介面的使用與類的使用有些不同,在需要使用類的地方,會直接進行 new 關鍵字來建立一個類的例項,但是介面不行。
- 介面必須通過類來實現他的抽象方法。介面必須通過類來實現他的抽象方法。
- 如果一個類不能實現完介面中的抽象方法,那麼這個類我們應該設計為抽象類。
- 不允許建立介面的例項,但是允許定義介面型別的引用變數引用實現該介面的類的例項。
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. 動多型(執行時多型)
發生動多型的三個條件:
- 繼承
- 方法的重寫
- 父類引用派生類物件(向上造型)
向上造型就是定義父類的引用,引用派生類的物件。例,
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("哈哈");
}
}
//結果:
子類
父類
哈哈