自從貓狗霸佔我的牀之後,無事可做,就被迫學習。。。。。
Java中定義的沒有方法體的方法,稱該方法爲抽象方法,包含抽像方法的類稱爲抽象類。
當類中的方法不確定有什麼內容時,可以先使用一個抽象類
//例如
abstrack class Animal{
//抽象方法沒有大括號{},並且前有abstract關鍵字所修飾
public abstrack void eat();
}
abstrack class Cat extends Animal{
/*當繼承的父類裏出現抽象方法時,繼承方式有兩種:
1.子類應被abstract所修飾
2.父親中所有抽象方法要重寫
*/
void eat(){
}
}
public static void main(String[] args)
{
//Animal a=new Animal(); 會報錯,抽象類無法實例化
}
抽象類的特點
- 抽象類中可以有構造方法
- 抽象類中可以定義不是抽象類的方法
- abstract 使用時不能與public static final等關鍵字同時使用
- 抽象類一定是個父類
接口
特殊的抽象類
格式
interface 接口名{}
接口中成員修飾符是固定的。
成員變量:public static final
成員函數:public abstract
//接口類似於繼承但不同,類與接口之間是實現關係
//接口不能實例化對象
interface A{
public static final string name="zs";
public abstract void eat();
}
//實現接口A,A中有抽象函數,處理方法與繼承相同,有兩種
class B implements A{
public void eat(); //在這我選重寫這一方式
}
interface C{
}
//子類在繼承一個類的同時,還可以實現多個接口
//優點,避免了單繼承的侷限性
//要先繼承一個類再實現接口
class D extends B implements A,C{
}
//類與類之間是單繼承,接口與接口之間是多繼承
interface E extends A,C{
}
接口的應用
舉個栗子
這裏我們可以從底層不斷尋找共性向上層抽取。這種可以用繼承關係來處理
當對象擁有多個技能時,這是用接口來實現
來寫代碼吧
class Person{
String name;
String sex;
void eat()
{
System.out.println("人要吃飯。");
}
void sleep()
{
System.out.println("人要睡覺。");
}
}
abstract class Student extends Person{ //我不會用英語寫運動員so臨時改成學生和老師
abstract void learn();
}
abstract class Teacher extends Person{
abstract void teach();
}
interface A{
void LearnEglish();
}
class Bstudent extends Student implements A{
public void learn(){
System.out.println("學習籃球");
}
public void LearnEglish()
{
System.out.println("學英語");
}
}
class Bteacher extends Teacher{
public void teach(){
System.out.println("教籃球");
}
}
class Demo1{
public static void main(String[] args)
{
Bstudent s=new Bstudent();
s.learn();
s.LearnEglish();
}
}
總結抽象類和接口
相同:都是將相同的東西抽取出來
不同:
- 抽象類需要被繼承,接口需要被實現
- 抽象類只能單繼承,接口可以多實現
- 抽象類可以有抽象和非抽象的方法,接口只能是抽象方法
- 抽象類的繼承,是該體系中基本共性的內容,接口是該體系中額外的功能