轉(zhuǎn)發(fā)請(qǐng)注明出處:
安卓猴的博客(http://sunjiajia.com)
本節(jié)課程將學(xué)習(xí)以下內(nèi)容:
- 抽象函數(shù)的語(yǔ)法特征
- 抽象類的語(yǔ)法特征
- 抽象類的作用
抽象函數(shù)的語(yǔ)法特征
定義:
只有函數(shù)的定義(返回值類型、函數(shù)名采幌、參數(shù)列表)事示,沒(méi)有函數(shù)體的函數(shù)被稱為抽象函數(shù)如筛。
特點(diǎn):
- 如果一個(gè)類中有一個(gè)或者一個(gè)以上的抽象函數(shù)赡突,那么這個(gè)類也必須被定義為抽象類;
格式:
abstract void function();
抽象類的語(yǔ)法特征
定義:
使用abstract定義的類(在class前加上abstract關(guān)鍵字)稱之為抽象類见秽。
特點(diǎn):
- 抽象類天生就是用來(lái)被繼承的盔然,俗稱基類桅打;抽象類的子類也必須聲明為抽象的,或者愈案,必須在子類中復(fù)寫父類中的抽象函數(shù)挺尾;
- 抽象類不能夠生成對(duì)象;但抽象類可以有構(gòu)造函數(shù)站绪,它可以在子類中被調(diào)用遭铺;(重要)
- 如果一個(gè)類當(dāng)中包含有抽象函數(shù),那么這個(gè)類必須被聲明為抽象函數(shù)恢准;
- 如果一個(gè)類當(dāng)中沒(méi)有抽象函數(shù)魂挂,那么這個(gè)類也可以被聲明為抽象類。
例子1:(請(qǐng)動(dòng)手)
- 創(chuàng)建一個(gè)名為Person.java的Java源文件:
abstract class Person{
String name;
int age;
Person(){
System.out.println("Person的構(gòu)造函數(shù)");
}
Person(String name, int age){
this.name = name;
this.age = age;
System.out.println("Person的2個(gè)參數(shù)構(gòu)造函數(shù)");
}
void introduce(){
System.out.println("我的名字叫 " + this.name + "顷歌,我的年齡是 " + this.age);
}
//抽象函數(shù)
abstract void eat();
}
2.創(chuàng)建一個(gè)名為Chinese.java的Java源文件:
class Chinese extends Person {
String address;
Chinese(){
System.out.println("Chinese的構(gòu)造函數(shù)");
}
Chinese(String name, int age, String address){
super(name, age);
this.address = address;
System.out.println("Chinese的3個(gè)參數(shù)構(gòu)造函數(shù)");
}
// Chinese這個(gè)子類復(fù)寫了Person中的抽象函數(shù)eat()锰蓬,
// 復(fù)寫后的eat()函數(shù)不再是抽象函數(shù),
// 因此眯漩,Chinese類中沒(méi)有抽象函數(shù),它也不需要聲明為抽象類麻顶。
void eat(){
System.out.println("用筷子吃飯赦抖!");
}
}
3.創(chuàng)建一個(gè)名為Demo01.java的Java源文件:
class Demo01 {
public static void main(String[] args) {
// 子類的對(duì)象賦值給父類的引用,這是向上轉(zhuǎn)型辅肾。
Person p01 = new Chinese();
p01.eat();
}
}
抽象類的作用
作用:
- 父類無(wú)法完成的函數(shù)具體功能队萤,就聲明為抽象函數(shù),讓子類復(fù)寫實(shí)現(xiàn)(必須)矫钓;
- 通過(guò)方法的復(fù)寫實(shí)現(xiàn)了多態(tài)的屬性要尔。
例子2:(請(qǐng)動(dòng)手)
1.新建一個(gè)Printer.java的Java源文件:
abstract class Printer{
void open(){
System.out.println("open");
}
void close(){
System.out.println("close");
}
// 抽象函數(shù)print()
abstract void print();
}
2.新建一個(gè)HpPrinter.java的Java源文件:
// 該惠普打印機(jī)為噴墨打印機(jī)
class HpPrinter extends Printer{
// 重寫父類的抽象方法print()方法
void print(){
System.out.println("使用惠普噴墨打印機(jī)進(jìn)行打印");
}
}
3.新建一個(gè)CanonPrinter.java的Java源文件:
// 該佳能打印機(jī)為針式打印機(jī)
class CanonPrinter extends Printer{
// 重寫父類的抽象方法print()方法
void print(){
System.out.println("使用佳能針式打印機(jī)進(jìn)行打印");
}
}
4.新建一個(gè)Demo01.java的Java源文件:
// 該佳能打印機(jī)為針式打印機(jī)
class Demo01{
public static void main(String[] args) {
Printer hp = new HpPrinter(); // 向上轉(zhuǎn)型
hp.open();
hp.print();
hp.close();
Printer cannon = new CanonPrinter();
cannon.open();
cannon.print();
cannon.close();
}
}