抽象類必須要有抽象方法嗎?
1.什么是抽象類?
類--通過class關(guān)鍵字創(chuàng)建的java元素
抽象類---通過abstract class創(chuàng)建的java元素
判斷一個(gè)java類是否是一個(gè)抽象類,看它是否使用abstract修飾。
2.為什么要有抽象類?
為了減少代碼的重復(fù)編寫,提供代碼的重用性。
例如:坐車收費(fèi)----公交車收費(fèi)【全程1元】
? ? ? ? ? ? ? ? ? ? ? ? ----出租車收費(fèi)【每公里1元】
公交車 extends 汽車[收費(fèi)功能]
出租車 extends 汽車[收費(fèi)功能]
汽車提供了收費(fèi)功能,但是沒有具體的收費(fèi)標(biāo)準(zhǔn),具體的收費(fèi)標(biāo)準(zhǔn)是由公交車/出租車根據(jù)自身的實(shí)際情況決定收費(fèi)標(biāo)準(zhǔn)。
我們可以認(rèn)為汽車是一個(gè)抽象類,它只提供功能,不給具體實(shí)現(xiàn);
公交車/出租車都是汽車這個(gè)抽象類的子類,公交車/出租車就會從汽車的抽象類上繼承功能,根據(jù)自身的實(shí)際情況實(shí)現(xiàn)這個(gè)功能。
抽象類為同一種類的事物提供功能,讓它的子類根據(jù)自身的實(shí)際情況實(shí)現(xiàn)這個(gè)功能。
3.抽象類中可以有哪些元素?
類---實(shí)例變量,靜態(tài)成員變量,構(gòu)造方法,實(shí)例方法,靜態(tài)方法
抽象類---實(shí)例變量,靜態(tài)成員變量,構(gòu)造方法,實(shí)例方法,靜態(tài)方法,抽象方法
抽象方法---1.使用abstract關(guān)鍵字修飾
? ? ? ? ? ? ? ? ? 2.沒有方法體“{}”
package com.wangxing.chouxiang1;
//抽象類--通過abstract class創(chuàng)建的java元素
public abstract class ChouXiangLei1 {
//實(shí)例變量
public? String? shili="實(shí)例變量";
//靜態(tài)成員變量
public static String? staticbianliang="靜態(tài)成員變量";
//構(gòu)造方法
public ChouXiangLei1(){
System.out.println("抽象類中的構(gòu)造方法");
}
//實(shí)例方法
public void? shiliMethod(){
System.out.println("抽象類中的實(shí)例方法");
}
//靜態(tài)方法
public static void? staticMethod(){
System.out.println("抽象類中的靜態(tài)方法");
}
//抽象方法
//1.使用abstract關(guān)鍵字修飾
//2.2.沒有方法體“{}”
public abstract void? abstractMethod();
}
4.抽象類的具體用法
? 1.抽象類不能通過new+構(gòu)造方法的形式創(chuàng)建對象的
? 2.抽象類中可以有抽象方法,可以一個(gè)抽象方法都沒有
? 3.當(dāng)一個(gè)普通的java類繼承一個(gè)抽象類,就需要實(shí)現(xiàn)抽象類提供的所有抽象方法也可以將這個(gè)普通的java類改成抽象類
? 4.抽象類可以繼承抽象類
? 5.當(dāng)某一個(gè)普通的java類中的方法參數(shù)是抽象類類型的時(shí)候,可以傳遞上轉(zhuǎn)型對象,也可以是抽象類的子類對象。
5.賣水果實(shí)例
package com.wangxing.test1;
//水果抽象類
public abstract class ShuiGuo {
????//抽象方法
????public abstract void? chi();
}
package com.wangxing.test1;
//水果--西瓜
public class XiGua extends ShuiGuo{
????@Override
????public void chi() {
????????System.out.println("用刀切開吃西瓜");
????}
}
package com.wangxing.test1;
//水果--蘋果
public class PingGuo extends ShuiGuo{
????@Override
????public void chi() {
????????System.out.println("削皮以后吃蘋果");
????}
}
package com.wangxing.test1;
public class ShuiGuoDian {
????public static ShuiGuo? maiShuiGuo(String name){
????????ShuiGuo? sg=null;
????????if(name.equals("西瓜")){
????????????sg=new XiGua();
????????}
????????if(name.equals("蘋果")){
????????????sg=new PingGuo();
????????}
????????if(name.equals("桃子")){
????????????sg=new TaoZi();
????????}
????????return sg;
????}
}
package com.wangxing.test1;
public class TestMain {
public? static? void? main(String args[]){
????ShuiGuo sg=ShuiGuoDian.maiShuiGuo("桃子");
????if(sg!=null){
????????sg.chi();
????}else{
????????System.out.println("沒有買到想吃的水果");
????}
????}
}
總結(jié):
抽象類就是使用abstract關(guān)鍵字修飾的java類。判斷一個(gè)類是不是一個(gè)抽象類主要看class前面有沒有abstract關(guān)鍵字,而不是看它有沒有抽象方法。
抽象方法--1.abstract修飾
?????????????????2.沒有方法體
抽象類中可以有抽象方法,也可以一個(gè)抽象方法都沒有。
普通的java類是不能有抽象方法的,能夠包含抽象方法的java類一定是抽象類