一什往、抽象類(lèi)
抽象:籠統(tǒng),模糊躯舔,看不懂省古!不具體
抽象類(lèi)的由來(lái):舉個(gè)栗子說(shuō)明
抽象類(lèi):當(dāng)一個(gè)類(lèi)在描述事物時(shí),沒(méi)有足夠的信息去描述這個(gè)事物飒赃,就叫抽象類(lèi)
抽象類(lèi)的特點(diǎn)
1科侈、方法只有聲明沒(méi)有實(shí)現(xiàn)時(shí),該方法就是抽象方法臀栈,需要被abstract修飾 抽象方法必須定義在抽象類(lèi)中。該類(lèi)也必須被abstract修飾姑躲。 2睡扬、抽象類(lèi)不可以被實(shí)例化黍析。因?yàn)檎{(diào)用抽象方法沒(méi)意義。 3马靠、抽象類(lèi)必須有其子類(lèi)覆蓋所有的抽象方法后蔼两,該子類(lèi)才可以實(shí)例化,否則這個(gè)子類(lèi)還是抽象類(lèi)额划。
通過(guò)5個(gè)問(wèn)題來(lái)細(xì)說(shuō)抽象類(lèi)
1俊戳、抽象類(lèi)中有構(gòu)造函數(shù)嗎揖赴?
有品抽,用于給子類(lèi)對(duì)象初始化
2甜熔、抽象類(lèi)可以不定義抽象方法嗎?
可以盆昙,很少見(jiàn) 目的就是不讓該類(lèi)創(chuàng)建對(duì)象焊虏。有方法體,卻沒(méi)有內(nèi)容诵闭。 eg:AWT的適配器
3、抽象關(guān)鍵字不可以和哪些關(guān)鍵字共存瘟芝?
private 不行 抽象方法要被覆蓋褥琐,私有了子代都不知道去哪覆蓋?敌呈! static 不行 抽象方法不需要對(duì)象造寝,因?yàn)榉椒w內(nèi)沒(méi)有內(nèi)容 final 不行 我要覆蓋abstract吭练,final不讓覆蓋,那不打架了么赐稽,共存?zhèn)€屁浑侥!
4、抽象類(lèi)和一般類(lèi)的異同點(diǎn)括丁。
相同點(diǎn):都是描述事物伶选,都在內(nèi)部定義了成員 不同點(diǎn):一般類(lèi)有足夠的信息描述信息史飞;但抽象類(lèi)描述事物的信息不足仰税。 一般類(lèi)中不能定義抽象方法;而抽象類(lèi)中可以定義抽象方法也可以定義非抽象方法 一般類(lèi)可以被實(shí)例化吐绵;抽象類(lèi)不能被實(shí)例化
5河绽、抽象類(lèi)一定是一個(gè)父類(lèi)嗎?
是耙饰! 因?yàn)樾枰宇?lèi)覆蓋其方法后才可以對(duì)子類(lèi)實(shí)例化
用抽象類(lèi)來(lái)舉個(gè)栗子:
雇員:
需求:公司中程序員有姓名苟跪,工號(hào)廷痘,薪水件已,工作內(nèi)容。
項(xiàng)目經(jīng)理除了姓名鳞陨,工號(hào),薪水厦滤,工作內(nèi)容,還有獎(jiǎng)金享怀。
對(duì)給出需求進(jìn)行數(shù)據(jù)建模
//分析:先找出涉及的對(duì)象:程序員趟咆,項(xiàng)目經(jīng)理
//程序員
// 屬性:姓名,工號(hào)值纱,薪水。
//行為:工作
//項(xiàng)目經(jīng)理
//屬性:姓名搀愧,工號(hào)疆偿,薪水,獎(jiǎng)金杆故。
//行為:工作
//程序員和項(xiàng)目經(jīng)理不存在這直接繼承關(guān)系
//但他們都是公司的雇員,可以將程序員和項(xiàng)目經(jīng)理進(jìn)行抽取饲趋,建立關(guān)系
//描述雇員
abstract class Employee
{
private String name;
private String id;
private double pay;
Employee(String name,String id,double pay)
{
this.name = name;
this.id = id;
this.pay = pay;
}
public abstract void work();
}
//描述程序員
class Programmer extends Employee
{
Programmer(String name,String id,double pay)
{
super(name,id,pay);
}
public void work()
{
System.out.println("code...");
}
}
//描述項(xiàng)目經(jīng)理
class Manager extends Employee
{
private int bonus;
Manager(String name,String id,double pay,int bonus)
{
super(name,id,pay);
this.bonus = bonus;
}
public void work()
{
System.out.println("manage");
}
}
二:接口(interface)
接口的由來(lái):當(dāng)抽象類(lèi)中的方法都是抽象的時(shí)候罢缸,這時(shí)可以將該抽象類(lèi)用另一種形式定義和表示,就是接口
就好像四條邊相等的長(zhǎng)方形叫正方形一樣
定義接口:關(guān)鍵字是interface不是class
interface Demo
{
}
接口中常見(jiàn)成員
全局常量
public static final
抽象方法
public abstract
由此看出接口中的成員都是公共的
由于接口里的都是抽象的,所以不用繼承叫實(shí)現(xiàn)息楔!
類(lèi)與類(lèi)之間叫繼承扒披,類(lèi)與接口之間叫實(shí)現(xiàn)!
接口不可以實(shí)例化
只能由實(shí)現(xiàn)了接口的子類(lèi)并覆蓋了接口中所有的抽象方法后碟案,該子類(lèi)才可以實(shí)例化。否則這個(gè)子類(lèi)就是一個(gè)抽象類(lèi)。
來(lái)個(gè)栗子說(shuō)明
interface Demo
{
public static final int NUM = 4;
public abstract void show1();
public abstract void show2();
}
class DemoImp1 implements Demo//翻譯過(guò)來(lái)是:這個(gè)Demolmp1類(lèi)實(shí)現(xiàn)了Demo這個(gè)接口
{
public void show1()
{}
public void show2()
{
}
}
class InerfaceDemo
{
public static void main(String[] args)
{
DemoImp1 d = new DemoImp1(); //不可以有 d.NUM = 3; 因?yàn)镹UM的值是final
System.out.println(d.NUM); //對(duì)象
System.out.println(DemoImp1.NUM); //子類(lèi)調(diào)用NUM成員
System.out.println(Demo.NUM); //接口Demo調(diào)用NUM成員
}
}
面向?qū)ο笾姓f(shuō)過(guò)Java中不直接支持多繼承,因?yàn)闀?huì)出現(xiàn)調(diào)用的不確定性扮叨。
所以Java將多繼承機(jī)制改良,變成了多實(shí)現(xiàn)一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口
多實(shí)現(xiàn)的體現(xiàn)
interface A
{
public abstract void show();
}
interface B
{
public abstract void show();
}
class Test implements A,B//多實(shí)現(xiàn)
{
public void show() //及覆蓋了A的中的show又覆蓋了B中的show
{
}
}
class InerfaceDemo
{
public static void main(String[] args)
{
Test t = new Test();
t.show();
}
}
一個(gè)類(lèi)在繼承另一個(gè)類(lèi)的同時(shí)碍沐,還可以實(shí)現(xiàn)多個(gè)接口衷蜓。接口的出現(xiàn)避免了單繼承的局限性
interface A
{
public abstract void show();
}
interface B
{
public abstract void show();
}
class Q
{
public void method()
{}
}
class Test2 extends Q implements A,B //test2繼承了Q 但還需要其他功能,
//所以通過(guò)接口實(shí)現(xiàn)其他功能
//先繼承再實(shí)現(xiàn)
{
}
接口和接口之間是繼承關(guān)系
總結(jié)一下:接口的特點(diǎn)
1、接口是對(duì)外暴露的規(guī)則 例如USB口 2刻恭、接口是程序的功能擴(kuò)展 3扯夭、接口的出現(xiàn)降低耦合性 4、接口可以用來(lái)多實(shí)現(xiàn) 5交洗、接口和接口之間是繼承關(guān)系 6、類(lèi)和接口是實(shí)現(xiàn)關(guān)系构拳,而且類(lèi)可以繼承一個(gè)類(lèi)的同時(shí)實(shí)現(xiàn)多個(gè)接口
三、抽象類(lèi)和接口的異同點(diǎn)
相同點(diǎn):都是不斷向上抽取而來(lái)的
不同點(diǎn):
1斗埂、抽象類(lèi)需要被繼承凫海,而且只能單繼承
接口需要被實(shí)現(xiàn),而且可以多實(shí)現(xiàn)
2行贪、抽象類(lèi)中可以定義抽象方法和非抽象方法,子類(lèi)繼承后崭捍,可直接使用非抽象方法
接口中只能定義抽象方法啰脚,必須由子類(lèi)去實(shí)現(xiàn)
3、抽象類(lèi)的繼承,是is a關(guān)系亮航。在定義該體系的基本共性?xún)?nèi)容谍倦。
接口的實(shí)現(xiàn)是 like a關(guān)系。在定義體系額外功能昼蛀。