Java初级笔记-第五章
第五章 面向?qū)ο蟮奶攸c(diǎn)
5.1 繼承
面向?qū)ο蟮闹匾攸c(diǎn)之一就是繼承。類的繼承使得能夠在已有的類的基礎(chǔ)上構(gòu)造新的類,新類除了具有被繼承類的屬性和方法外,還可以根據(jù)需要添加新的屬性和方法。繼承有利于代碼的復(fù)用,通過繼承可以更有效地組織程序結(jié)構(gòu),并充分利用已有的類來完成復(fù)雜的任務(wù),減少了代碼冗余和出錯(cuò)的幾率。
?
繼承通過extends 來表示。
class A extends B 表示類A繼承了類B,B是父類,A叫子類。A類有B類的相應(yīng)功能,并且還可以自己定義新的功能(方法及屬性)
?
對(duì)于父類與子類相同的方法簽名來說,叫方法的覆蓋,或重寫,以代替父類功能,但父類功能不消失。
?
super(參數(shù)) 可以調(diào)用父類的構(gòu)造方法。
super.xxx(參數(shù)) 可以調(diào)用父類的xxx方法。
5.1.1 方法的重寫(覆蓋)
重新編寫與父類同名同特征值的的方法,叫方法的重寫。
重寫后父類方法推動(dòng)作用。
5.2 封裝
在前邊介紹的類、變量和方法的聲明中都遇到了訪問限定符,訪問限定符用于限定類、成員變量和方法能被其他類訪問的權(quán)限,當(dāng)時(shí)我們只是簡(jiǎn)單介紹了了其功能,且只使用了public(公有的)和默認(rèn)(友元的)兩種形式。
在有了包的概念之后,我們將幾種訪問限定總結(jié)如下:
1. 默認(rèn)訪問限定
如果省略了訪問限定符,則系統(tǒng)默認(rèn)為是 friendly(友元的)限定。擁有該限定的類只能被所在包內(nèi)的其他類訪問。
2. public 訪問限定
由 public 限定的類為公共類。公共類可以被所有的其他類訪問。使用 public 限定符應(yīng)注意以下兩點(diǎn):
1)public 限定符不能用于限定內(nèi)部類。
2)一個(gè) Java 源程序文件中可以定義多個(gè)類,但最多只能有一個(gè)被限定為公共類。如果有公共類,則程序名必須與公共類同名。
3.private(私有的)訪問限定
private 限定符只能用于成員變量、方法和內(nèi)部類。私有的成員只能在本類(this)中被訪問,即只能在本類的方法中由本類的對(duì)象引用。
?
4.protected(保護(hù)的)訪問限定
protected 限定符也只能用于成員變量、方法和內(nèi)部類。用 protected 聲明的成員也被稱為受保護(hù)的成員,它可以被其子類(包括本包的或其他包的)訪問,也可以被本包內(nèi)的其他類訪問。
?
綜合上述,以表 5-1 簡(jiǎn)要列出各訪問限定的引用范圍。其中“√”表示可訪問,“×”表示不可訪問。
?表 5-1訪問限定的引用域和訪問范圍
| ? | 同一個(gè)類 | 同一個(gè)包 | 不同包的子類 | 不同包非子類 |
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | × |
| 缺省 | √ | √ | × | × |
| private | √ | × | × | × |
5.2.1 JavaBean
用Java語(yǔ)言描述的軟件組織模型就是JavaBean,它是Java中一種特殊的類,JavaBean在程序設(shè)計(jì)過程中,一般用在數(shù)據(jù)對(duì)象中,比如數(shù)據(jù)庫(kù)中的某個(gè)數(shù)據(jù)一條數(shù)據(jù)。他是在程序設(shè)計(jì)過程中,傳遞數(shù)據(jù)對(duì)象的。
特點(diǎn)如下:
1)有一個(gè)無參的公共構(gòu)造方法。(public)
2)有屬性,屬性最好都定義為私有的(private)
3)有與屬性相對(duì)應(yīng)的get和set方法。
如定義一上學(xué)生的JavaBean
| public class StudentBean { ???????? private String name;//一般定義為private ???????? private int age; ???????? public JavaBeanTest() { ???????? } ???????? public int getAge() { ?????????????????? return age; ???????? } ???????? public void setAge(int age) { ?????????????????? this.age = age; ???????? } ???????? public String getName() { ?????????????????? return name; ???????? } ???????? public void setName(String name) { ?????????????????? this.name = name; ???????? } } |
| public class TestJavaBean { ? ???????? public static void main(String[] args) { ?????????????????? // TODO Auto-generated method stub ?????????????????? StudentBean st = new StudentBean (); ?????????????????? st.setAge(3); ?????????????????? st.setName("張三"); ???????? } } |
?
?
5.3 抽象
5.2.1 抽象類的定義
在 Java 中所謂的抽象類,即是在類說明中用關(guān)鍵字abstract 修飾的類。
一般情況下,抽象類中可以包含一個(gè)或多個(gè)只有方法聲明而沒有定義方法體的方法。
什么時(shí)候用
當(dāng)遇到這樣一些類,類中的某個(gè)或某些方法不能提供具體的實(shí)現(xiàn)代碼時(shí),可將它們定義成抽象類。
格式
定義抽象類的一般格式如下:
[訪問限定符]?abstract? class?類名
{
???? //屬性說明????
…………
//抽象方法聲明
?…………
//非抽象方法定義
……………
}
?
其中,聲明抽象方法的一般格式如下:
?[訪問限定符]? abstract?數(shù)據(jù)類型? 方法名([參數(shù)表]);
注意:抽象方法只有聲明,沒有方法體,所以必須以“;”號(hào)結(jié)尾。
有關(guān)抽象方法和抽象類說明如下:
1)所謂抽象方法,是指在類中僅僅聲明了類的行為,并沒有真正實(shí)現(xiàn)行為的代碼。也就是說抽象方法僅僅是為所有的派生子類定義一個(gè)統(tǒng)一的接口,方法具體實(shí)現(xiàn)的程序代碼交給了各個(gè)派生子類來完成,不同的子類可以根據(jù)自身的情況以不同的程序代碼實(shí)現(xiàn)。
2)抽象方法只能存在于抽象類中,正像剛才所言,一個(gè)類中只要有一個(gè)方法是抽象的,則這個(gè)類就是抽象的。
3)構(gòu)造方法、靜態(tài)(static)方法、最終(final)方法和私有(private)方法不能被聲明為抽象的方法。
4)一個(gè)抽象類中可以有一個(gè)或多個(gè)抽象方法,也可以沒有抽象方法。如果沒有任何抽象方法,這就意味著要避免由這個(gè)類直接創(chuàng)建對(duì)象。
5)抽象類只能被繼承(派生子類)而不能創(chuàng)建具體對(duì)象即不能被實(shí)例化。 下邊我們舉例說明抽象類的定義。
?
抽象:表示的是可以不完整,不抽象就一定完整
?
| package cn.huasheng.chouxiang; ? abstract class DongWu { ? ???????? public String Name; ???????? public int age; ???????? public int sex; ? ???????? public abstract void say(); ???????? public abstract void run(); ???????? ???????? DongWu() {} ? ???????? public void setName(String name) { ?????????????????? this.Name = name; ???????? } } ? class Man extends DongWu { ???????? public void say() { ?????????????????? System.out.println("boy"); ???????? } ???????? public void run() { ? ???????? } ???????? } ? abstract class Woman extends DongWu { ???????? public void say() { ?????????????????? System.out.println("girl"); ???????? } } class Girl extends Woman{ ? ???????? @Override ???????? public void run() { ?????????????????? // TODO Auto-generated method stub ???????? } ? } ? public class PersonTest { ???????? public static void main(String[] arg) { ?????????????????? // DongWu dw = new DongWu();抽象類不可以實(shí)例化,用來定義對(duì)象,只能被繼承 ?????????????????? Man man1 = new Man(); ?????????????????? new Girl().say(); ?????????????????? man1.say(); ?????????????????? ???????? } ???????? public static void test() ???????? { ?????????????????? ???????? } } |
?
5.4 接口
在 Java 中可以把接口看作是一種特殊的抽象類,它只包含常量和和抽象方法的定義,而沒有變量和方法的實(shí)現(xiàn),它用來表明一個(gè)類必須做什么,而不去規(guī)定它如何做。因此我們可以通過接口表明多個(gè)類需要實(shí)現(xiàn)的方法。由于接口中沒有具體的實(shí)施細(xì)節(jié),也就沒有和存儲(chǔ)空間的關(guān)聯(lián),所以可以將多個(gè)接口合并起來,由此來達(dá)到多重繼承的目的。
?
5.4.1 接口的定義
與類的結(jié)構(gòu)相似,接口也分為接口聲明和接口體兩部分。
定義接口的一般格式如下:
[public] interface 接口名 [extends父接口名列表]? //接口聲明
{
//接口體開始?
//常量數(shù)據(jù)成員的聲明及定義
數(shù)據(jù)類型?? 常量名=常數(shù)值;
……………
//聲明抽象方法
返回值類型? 方法名([參數(shù)列表]) [throw異常列表] ;
…………………
} //接口體結(jié)束
對(duì)接口定義說明如下:
1) 接口的訪問限定只有 public 和缺省的。
2) interface 是聲明接口的關(guān)鍵字,與class 類似。
3) 接口的命名必須符合標(biāo)識(shí)符的規(guī)定,并且接口名必須與文件名相同。
4) 允許接口的多重繼承,通過“extends父接口名列表”可以繼承多個(gè)接口。
5) 對(duì)接口體中定義的常量,系統(tǒng)默認(rèn)為是“staticfinal”修飾的,不需要指定。
6) 對(duì)接口體中聲明的方法,系統(tǒng)默認(rèn)為是“abstract”的,也不需要指定;對(duì)于一些特殊用途的接口,在處理過程中會(huì)遇到某些異常,可以在聲明方法時(shí)加上“throw 異常列表”,以便捕捉出現(xiàn)在異常列表中的異常。
5.4.2 接口的實(shí)現(xiàn)
所謂接口的實(shí)現(xiàn),即是在實(shí)現(xiàn)接口的類中重寫接口中給出的所有方法,書寫方法體代碼,完成方法所規(guī)定的功能。
定義實(shí)現(xiàn)接口類的一般格式如下:
[訪問限定符] [修飾符] class類名 [extends 父類名]? implements 接口名列表
{??
//類體開始標(biāo)志
[類的成員變量說明]? //屬性說明
[類的構(gòu)造方法定義]
[類的成員方法定義]? //行為定義
/*重寫接口方法*/
接口方法定義?????? //實(shí)現(xiàn)接口方法
}? //類體結(jié)束標(biāo)志下邊我們距離說明接口的實(shí)現(xiàn)。
| package cn.huasheng.jiekou; class Class1{ ???????? } interface Interface1 { ???????? final int A=10; ???????? int B = 20; ???????? void fun1(); ???????? void fun2(); } interface Interface2 { ???????? final int A=10; ???????? int D = 20; ???????? void fun3(); ???????? void fun4(); } interface Interface3 extends Interface1,Interface2{ ???????? } class Inter1 extends Class1 implements Interface1,Interface2{ ???????? public void fun1() { ?????????????????? System.out.println("fun1"); ???????? } ???????? public void fun2() { ?????????????????? System.out.println("fun2"); ???????? } ???????? public void fun3() { ?????????????????? System.out.println("fun3"); ???????? } ???????? public void fun4() { ?????????????????? System.out.println("fun4"); ???????? } } public class TestInterface{ ???????? public static void main(String [] args){ ?????????????????? Inter1 i = new Inter1(); ?????????????????? i.fun1(); ?????????????????? i.fun2(); ?????????????????? i.fun3(); ?????????????????? i.fun4(); ???????? } } |
5.5 異常
5.5.1 什么是異常
異常:就是不正常,是指程序在運(yùn)行時(shí)出現(xiàn)的不正常情況。其實(shí)就是程序中出現(xiàn)的問題。這個(gè)問題按照面向?qū)ο笏枷脒M(jìn)行描述,并封裝成了對(duì)象。因?yàn)閱栴}的產(chǎn)生有產(chǎn)生的原因、有問題的名稱、有問題的描述等多個(gè)屬性信息存在。當(dāng)出現(xiàn)多屬性信息最方便的方式就是將這些信息進(jìn)行封裝。異常就是java按照面向?qū)ο蟮乃枷雽栴}進(jìn)行對(duì)象封裝。這樣就方便于操作問題以及處理問題。
?
出現(xiàn)的問題有很多種,比如角標(biāo)越界,空指針等都是。就對(duì)這些問題進(jìn)行分類。而且這些問題都有共性內(nèi)容比如:每一個(gè)問題都有名稱,同時(shí)還有問題描述的信息,問題出現(xiàn)的位置,所以可以不斷的向上抽取。形成了異常體系。網(wǎng)絡(luò)突然中斷,文件不存在……
5.5.2 異常處理的5個(gè)關(guān)鍵字
try ,catch,
finally
throw, throws
異常處理格式
try{
?????????????????? //可能出異常的代碼
} catch(異常類?對(duì)象){
?????????????????? //處理該異常類型的語(yǔ)句
}
[finally] {
?????????????????? //一定會(huì)執(zhí)行的代碼
?????????????????? //catch塊使用System.exit(1);除外
}
?
備注:當(dāng)try語(yǔ)句塊出現(xiàn)異常,程序會(huì)自動(dòng)跳到catch語(yǔ)句塊去找匹配的異常類型,并執(zhí)行異常處理語(yǔ)句,finally語(yǔ)句塊是異常的統(tǒng)一出口。
5.5.3多異常處理
聲明異常時(shí)盡可能聲明具體異常類型,方便更好的處理;
方法聲明幾個(gè)異常就對(duì)應(yīng)有幾個(gè)catch塊;
若多個(gè)catch塊中的異常出現(xiàn)繼承關(guān)系,父類異常catch塊放在最后;
在catch語(yǔ)句塊使用Exception類作為異常類型時(shí):
所有子類實(shí)例都可以使用父類接收(向上轉(zhuǎn)型),即所有的異常對(duì)象都可以使用Exception接收;
注:在java處理多異常時(shí)捕獲小范圍的異常必須放在大范圍異常之前。
?
java7 - 同時(shí)捕獲多個(gè)異常類型
Java7之前:
try {
???????? inta =1;
???????? intb =0;
???????? intc = a / b;
???????? System.out.println(c);
} catch (NumberFormatException e)
{
??e.printStackTrace();
} catch(ArithmeticException e)
{
???????? e.printStackTrace();
}
?
Java7:將多個(gè)異常寫到了同一個(gè)catch代碼塊
try {
Integer a = 1;
Integer b = 0;
?
Integer c = a / b;
?
System.out.println(c);
?
} catch (NumberFormatException
???????? |ArithmeticException? e ) {
???????? ?e.printStackTrace();
}
5.5.4異常的分類
?
異常分類:
編譯時(shí)被檢查異常; ????? ---> Checked異常
在程序中必須使用try...catch處理;
編譯時(shí)不被檢測(cè)的異常;??????? ---> Runtime異常
可以不使用try...catch處理,但一旦出現(xiàn)異常就將由JVM處理。
?
Runtime異常
RuntimeException(運(yùn)行時(shí)異常)是指因設(shè)計(jì)或?qū)崿F(xiàn)方式不當(dāng)而導(dǎo)致的問題.
說白了,就是程序員造成的,程序員小心謹(jǐn)慎是完全可以避免的異常.比如,事先判斷對(duì)象是否為null就可以避免NullPointerException異常,事先檢查除數(shù)不為0就可以避免ArithmeticException異常;
?
特點(diǎn):
這種異常Java編譯器不會(huì)檢查它,也就說程序中出現(xiàn)這類異常的時(shí)候,即使不處理也沒有問題,但是一旦出現(xiàn)異常,程序?qū)惓=K止,若采用異常處理,則會(huì)被相應(yīng)的程序執(zhí)行處理。
?
Checked異常
?
除了RuntimeException以及子類,其他的Exception及其子類都是受檢查異常,我們也可以稱為非RuntimeException異常.
特點(diǎn):
Java編譯器會(huì)檢查它,也就說程序中一旦出現(xiàn)這類異常,要么是沒有try-catch語(yǔ)句捕獲,或throws語(yǔ)句沒有聲明拋出它,編譯就不會(huì)通過,也就說這種異常,程序要求必須處理。
?
5.5.5聲明異常(throws)
在可能出現(xiàn)異常的方法上聲明拋出可能出現(xiàn)異常的類型:
聲明的時(shí)候盡可能聲明具體的異常,方便更好的處理.
當(dāng)前方法不知道如何處理這種異常,可將該異常交給上一級(jí)調(diào)用者來處理(非RuntimeException類型的異常)。
方法一旦使用throws聲明拋出方法內(nèi)可能出現(xiàn)的異常類型,該方法就可以不再過問該異常了;
一個(gè)方法調(diào)用另一個(gè)使用throws聲明拋出的方法,自己要么try...catch, 要么也throws;
?
格式:
public 返回值類型?方法名(參數(shù)列表...)throws 異常類A,異常類B... {
????????
}
?
5.5.6拋出異常throw
自行拋出一個(gè)異常對(duì)象,拋出異常類的對(duì)象;
若throw拋出的是Runtime異常:
程序可以顯示使用try...catch來捕獲并處理,也可以不管,直接交給方法調(diào)用者處理;
若throw拋出Checked異常:
要么放在try里自己處理,要么放在一個(gè)throws聲明的方法里面,交給調(diào)用者處理。
?
?
Eg:
???????? publicstatic void main(String[] args) {
?????????????????? try{
?????????????????? ????? fn1(1);
?????????????????? }catch (Exception e) { e.printStackTrace(); }
?????????????????? fn2(2);
???????? }
???????? publicstatic void fn1(int a) throws Exception{
?????????????????? if(a>0) { throw new Exception("fn1 -- a值不合法"); }
???????? }
???????? publicstatic void fn2(int a) {
?????????????????? if(a>0) { throw new RuntimeException("a值不合法"); }
???????? }
?
throws & throw
?
throws用于在方法上聲明該方法不需要處理的異常類型。
throw用于拋出具體異常類的對(duì)象。
throws與throw的區(qū)別:
thorws用在方法上,后面跟異常類名,可以是多個(gè)異常類。
throw用在方法內(nèi),后面跟異常對(duì)象,只能是一個(gè)。
?
5.5.7 finally
?
異常的統(tǒng)一出口:
不管try塊程序是否異常,也不管哪個(gè)catch執(zhí)行,finally塊總會(huì)執(zhí)行。
try語(yǔ)句塊或會(huì)執(zhí)行的catch語(yǔ)句塊使用了JVM系統(tǒng)退出語(yǔ)句例外;//System.exit(1);
try塊必須和 catch塊或和finally同在,不能單獨(dú)存在,二者必須出現(xiàn)一個(gè)。
不要在finally中使用return 或throw語(yǔ)句,否則將會(huì)導(dǎo)致try、catch中的return或throw失效。
?
finally代碼塊只在一種情況下不執(zhí)行:System.exit(0);
?
Eg:
package reviewDemo;
?
public class Demo19 {
??? public static void main(String[] args) {
?????? try{
?????????? System.out.println(17/0);
?????? }catch(Exception e){
?????????? //e.printStackTrace();
?????????? System.out.println("程序錯(cuò)誤,請(qǐng)修正!");
?????? }finally{
?????????? System.out.println("這是finally代碼塊!");
?????? }
??? }
}
?
輸出:
程序錯(cuò)誤,請(qǐng)修正!
這是finally代碼塊!
?
5.5.8、throw和catch同時(shí)使用
?
當(dāng)異常出現(xiàn)在當(dāng)前方法中,程序只對(duì)異常進(jìn)行部分處理,還有一些處理需要在方法的調(diào)用者中才能處理完成,此時(shí)還應(yīng)該再次拋出異常,這樣就可以讓方法的調(diào)用者也能捕獲到異常;
?
例如:
public static void buy(String price) throwsException {
???????? try{
?????????????????? if(price!= null)
??????????????????????????? Double.parseDouble(price);
???????? }catch (Exception e) {
?????????????????? e.printStackTrace();
?????????????????? thrownew Exception("價(jià)格不能只能是數(shù)字組成");
???????? }
}
public static void main(String[] args)? {
???????? try{
?????????????????? buy(null);
???????? }catch (Exception e) {
?????????????????? System.out.println(e.getMessage());
???????? }
}
?
?
總結(jié)
以上是生活随笔為你收集整理的Java初级笔记-第五章的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到胳膊出血是什么预兆
- 下一篇: Java参考资料-中文API