昨日內(nèi)容回顧
-
類成員
- 構(gòu)造函數(shù):和類同名,沒有返回值,可以重載
this(),super() - 成員變量:
- 成員函數(shù):
- 靜態(tài)代碼塊:類加載執(zhí)行
- {}:構(gòu)造代碼塊
- 構(gòu)造函數(shù):和類同名,沒有返回值,可以重載
-
interface
所有方法都是抽象的
屬性有固定的修飾符.
接口之間是繼承關(guān)系,可以多重繼承
-
類和接口之間是實(shí)現(xiàn)關(guān)系,類可以實(shí)現(xiàn)多個接口
class A implements B,C,D 面向接口編程降低耦合度.
-
抽象類
- abstract class
- 抽象方法沒有方法體,所在的類必須抽象類。
- 抽象類可以沒有抽象方法。
- 不能實(shí)例化,有構(gòu)造函數(shù)
-
final
修飾類,類不能被繼承
修飾方法,方法不能被重寫
修飾變量,不能被修改,常量
-
內(nèi)部類
成員位置:Benz$Engine
方法內(nèi)部:Benz$nEngine
繼承
extends: 單重繼承,多層繼承
作業(yè)解析
文字闡述靜態(tài)代碼塊的作用。
答:靜態(tài)代碼塊在類加載時執(zhí)行,且只執(zhí)行一次,靜態(tài)代碼塊用于初始化類。構(gòu)造代碼塊與構(gòu)造函數(shù)的調(diào)用順序如何?和方法的聲明位置是否有關(guān)?為什么?構(gòu)造代碼塊的作用是什么?
答:構(gòu)造代碼塊與構(gòu)造函數(shù)是同一級別的,不管聲明順序如何,構(gòu)造對象時先按序調(diào)用構(gòu)造代碼塊,然后才調(diào)用構(gòu)造函數(shù)。構(gòu)造代碼塊的作用是給對象統(tǒng)一初始化數(shù)據(jù)類加載時,是否一定會執(zhí)行靜態(tài)代碼塊?如何手動控制類加載?
答:不一定,可以通過Class.forName(String,boolean initialize, ClassLoder)方法手動控制-
定義類Person,Man,Woman形成繼承關(guān)系。
class Person{ String name; int age; } class Man extends Person{ } class Woman extends Person{ } 什么是抽象方法?什么是抽象類?抽象類是否有構(gòu)造函數(shù),是否可以重載?
答:沒有方法體的方法就是抽象方法,用abstract修飾, 抽象類是不能夠?qū)嵗念?,用abstract修飾,有構(gòu)造函數(shù),可以重載-
抽象修飾符有哪些非法組合?并給出合理的解釋?
答:- private abstract: abstract修飾的方法需要子類去實(shí)現(xiàn),若定義為private,則無法被子類繼承,更別說實(shí)現(xiàn)了
- final abstract: final修飾的方法不能被重寫,也就無法實(shí)現(xiàn)
- static abtract: 用abtract修飾的目的就是不想讓方法被實(shí)例化對象調(diào)用,static則不需要實(shí)例化就可以調(diào)用類的方法,與abstract設(shè)計(jì)的初衷不符
-
super和this作用以及用法以及注意事項(xiàng)?
答:- super是指向父類的引用。訪問父類構(gòu)造用super(xxx),必須在構(gòu)造函數(shù)第一行,訪問父類屬性和方法使用super.
- this是指向?qū)ο笞陨淼囊?。訪問自身屬性和方法使用this.,訪問自身構(gòu)造使用this(xxx),且必須放置在構(gòu)造函數(shù)的首行。
-
定義接口
-
IWhite
interface IWhite{ public void iWhite(); } -
IRich
interface IRich{ public void iRich(); } -
IBeanti
interface IBeanti{ public void iBeanti(); } 定義類,實(shí)現(xiàn)以上三個接口.(WomenStar)
-
interface IWRB extends IWhite,IRich,IBeanti{
}
class WomenStar implements IWRB{
public void iWhite(){
System.out.println("white");
}
public void iRich(){
System.out.println("rich");
}
public void iBeanti(){
System.out.println("beanti");
}
}
* 定義土豪類(EarchRicher.marring(...))
class EarchRicher{
public void marring(IWRB i){
i.iWhite();
i.iRich();
i.iBeanti();
}
}
多態(tài)
多態(tài)就是多種狀態(tài)(形態(tài))
對繼承的類來講,使用父類類型引用子類的對象;
對于接口來說,可以使用接口引用實(shí)現(xiàn)了該接口的類所創(chuàng)建的對象;好丈夫 + 好父親 + 好兒子
ClassCastException:類轉(zhuǎn)換異常繼承和實(shí)現(xiàn)是多態(tài)的前提條件
-
類中方法可以覆蓋,成員變量(資產(chǎn))不能覆蓋
class Person{ public int prop ; //財產(chǎn) } class Man extends Person{ public int prop ; // } public static void main(String[] args){ Man man = new Man(); Person p = man ; Object obj = new Man(); Person pp = (Man)obj ; }
匿名內(nèi)部類對象
將類的定義,方法的實(shí)現(xiàn),對象的創(chuàng)建一氣呵成
適配器模式
如果接口中的方法較多,而使用接口的時候卻只關(guān)心其中的一個或者幾個方法(關(guān)心的方法較少);
如果采用常規(guī)手段,就需要對每個方法都加以實(shí)現(xiàn)??梢詣?chuàng)建一個類來實(shí)現(xiàn)接口,對不關(guān)心的方法進(jìn)行空實(shí)現(xiàn),對關(guān)心的方法保持不變。定義的新類繼承抽象類后,將所關(guān)心的方法加以實(shí)現(xiàn)即可。
此種模式就稱為適配器模式。常用于UI設(shè)計(jì)中的按鈕點(diǎn)擊事件的處理
練習(xí)
- 定義Father類,聲明asset int私有屬性,同時生成get/set方法。
- 定義Son類繼承Father,聲明asset int私有屬性,同時生成get/set方法。
- 創(chuàng)建Son對象,分別使用Father和Son類型的變量進(jìn)行引用,依次調(diào)用
他們的setAsset()方法,然后再依次調(diào)用getAsset()方法,觀察打印數(shù)據(jù)是否相同?
class Father{
//私有財產(chǎn)
private int asset = 10000;
//getter
public int getAsset(){
return asset ;
}
//setter
public void setAsset(int asset) {
this.asset = asset ;
}
}
class Son extends Father{
public int asset = 100;
public void setAsset(int asset){
this.asset = asset ;
}
public int getAsset(){
return asset ;
}
public int getFatherAsset(){
return super.getAsset();
}
}
class MultiDemo3{
public static void main(String[] args){
Son s = new Son();
s.setAsset(500); //若setAsset()沒有被重寫,則 father.asset = 500;若setAsset()被重寫,則self.asset = 500
System.out.println(s.getAsset()); //若getAsset()沒有重寫,則==10000;若getAsset()被重寫,則==500
System.out.println(s.asset); //若setAsset()沒有被重寫==100;若setAsset()被重寫==500;
System.out.println("--------");
Son ss = new Son();
Father ff = ss ;
ff.setAsset(800);//若setAsset()沒有被重寫,則father.asset = 800;若setAsset()被重寫,則son.asset = 800;
System.out.println(ss.asset);// 800
ss.setAsset(900);//若setAsset()沒有被重寫,則father.asset = 900;若setAsset()被重寫,則son.asset = 900;
System.out.println(ff.getAsset()); //若getAsset()沒有重寫,則==10000;若getAsset()被重寫,則==900
System.out.println(ss.getFatherAsset());//10000
}
}
作業(yè)
使用接口進(jìn)行如下程序設(shè)計(jì)
個人電腦(PC)具有PCI插槽,可以插入PCI卡。顯卡、聲卡、語音卡都可以作為PCI卡插入PCI插槽中
PC,PCI,slot,VideoCard,SoundCard, VoiceCard高富帥
Height
Rich
Handsome
Girl boyFriend(HRH h)
用匿名內(nèi)部類實(shí)現(xiàn)使用適配器模式實(shí)現(xiàn)窗口的事件處理程序
窗口可以響應(yīng)最大化事件、最小化事件、大小改變事件、恢復(fù)事件、移動事件、關(guān)閉事件
通過適配器對大小改變事件、移動事件和關(guān)閉進(jìn)行默認(rèn)處理,窗口只關(guān)心最大化和最小化事件即可。
Window
WindowListener{max min resize restore move close}使用抽象類和接口實(shí)現(xiàn)適配器模式設(shè)計(jì)。涉及的類和接口分別為ButtonListener(接口),
其中含有click() / dbclick() / keyUp() / keyDown()等方法。
ButtonAdapter(按鈕適配器類),適配器中對非click()方法進(jìn)行默認(rèn)實(shí)現(xiàn)。
Button類中添加addListener(ButtonListener l)方法。闡述什么是多態(tài)。
為什么函數(shù)可以覆蓋,而屬性不能覆蓋?