一、抽象概述
-
不具體的,似是而非的
-
沒有具體實作的
-
比如Animal,只是對動物的大概描述
-
能吃
-
能睡
-
-
具體吃啥,怎么睡我們無從得知,創建出來的物件意義不大
-
我們認為這種類不應該直接創建物件,應該讓其子類創建具體的物件
-
怎么限制?做成抽象類
-
abstract修飾的類可以變成抽象類
-
二、抽象類(重點)
2.1 定義
-
被abstract修飾的類成為抽象類
-
無法直接創建物件
-
抽象類中可以存在抽象方法
package com.qf.abs;
?
public class Demo01 {
public static void main(String[] args) {
// 抽象類無法直接創建物件
// Animal animal = new Animal();
}
}
?
abstract class Animal{
public abstract void eat();
}
?
2.2 抽象類的子類和物件
-
抽象類無法直接創建物件,但是可以有子類
-
抽象類的子類繼承抽象類之后可以獲取到抽象類中的非私有普通屬性和方法
-
抽象類的子類如果想使用抽象類中的抽象方法,必須重寫這些方法之后才能使用
-
如果不使用抽象方法,做成抽象類也是可以的
package com.qf.abs;
?
public class Demo01 {
public static void main(String[] args) {
// 抽象類無法直接創建物件
// Animal animal = new Animal();
Husky husky = new Husky();
System.out.println(husky.type);
husky.breath();
husky.eat();
}
}
?
/**
* 抽象類Animal
* 描述動物的一個類
* 只做了大概的描述,沒有具體的實作
* 需要子類繼承此類后做具體的描述
* @author Dushine2008
*
*/
abstract class Animal{
// 屬性
String type = "動物";
String section;
public abstract void eat();
public abstract void sleep();
public void breath() {
System.out.println("所有的動物都依賴氧氣存活...");
}
}
?
?
abstract class Dog extends Animal{
}
?
class Husky extends Dog{
?
@Override
public void eat() {
System.out.println("二哈喜歡和主人同吃同住...");
}
?
@Override
public void sleep() {
System.out.println("二哈和主人同住同吃.................");
}
}
三、抽象類和多型案例(掌握)
-
創建抽象類Car
-
創建Car的子類
-
Auto
-
Bus
-
Tractor
-
-
在子類重寫繼承的抽象方法和自己獨有的方法
-
使用多型的思想創建物件并呼叫這些方法
package com.qf.abs;
?
public class Demo02 {
public static void main(String[] args) {
Car car01 = new Auto();
car01.start();
car01.stop();
// 向下轉型
Auto auto = (Auto) car01;
auto.manned();
System.out.println("========================");
Car car02 = new Bus();
car02.start();
car02.stop();
// 拆箱
Bus bus = (Bus) car02;
bus.manned();
System.out.println("========================");
Car car03 = new Tractor();
car03.start();
car03.stop();
Tractor tractor = (Tractor) car03;
tractor.doFarmWork();
}
}
?
/**
* 車的頂層類
* 抽象類
* 方法沒有具體的實作
* @author Dushine2008
*
*/
abstract class Car{
// 屬性
int weight;
int height;
String brand;
int price;
// 方法
public abstract void start();
public abstract void stop();
}
?
/**
* 奧拓車
* 繼承Car
* 重寫啟動和停止的方法
* @author Dushine2008
*
*/
class Auto extends Car{
?
@Override
