国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

4.內(nèi)部類(lèi)和IDE的使用

2019-11-08 02:30:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1 內(nèi)部類(lèi)

1.1 什么是內(nèi)部類(lèi)

  在一個(gè)類(lèi)的內(nèi)部,再定義一個(gè)類(lèi),那么這個(gè)類(lèi)就是內(nèi)部類(lèi)。

  特點(diǎn):內(nèi)部類(lèi)中可以直接訪(fǎng)問(wèn)其外部類(lèi)的成員,包括私有的成員。

  內(nèi)部類(lèi)分為成員內(nèi)部類(lèi)和局部?jī)?nèi)部類(lèi):在類(lèi)的成員位置定義的類(lèi),被稱(chēng)為成員內(nèi)部類(lèi);在類(lèi)的方法中(局部位置)定義的類(lèi),被稱(chēng)為局部?jī)?nèi)部類(lèi)。例如:

public class Outer { PRivate int outerNum = 100; class Inner1 { // 這是成員內(nèi)部類(lèi) public void show() { System.out.println(outerNum); // 可訪(fǎng)問(wèn)外部類(lèi)私有變量 } } public void method() { // 這是局部?jī)?nèi)部類(lèi) class Inner2 { public void show() { System.out.println(outerNum); // 也可訪(fǎng)問(wèn)外部類(lèi)私有變量 } } }}

  內(nèi)部類(lèi)生產(chǎn)的class文件為 “外部類(lèi)$內(nèi)部類(lèi).class”,為了標(biāo)明該內(nèi)部類(lèi)是屬于具體哪個(gè)外部類(lèi)的。

  成員內(nèi)部類(lèi)和局部?jī)?nèi)部類(lèi)都能訪(fǎng)問(wèn)外部類(lèi)的私有變量,下面主要介紹一些細(xì)節(jié)和內(nèi)部類(lèi)是如何被外界訪(fǎng)問(wèn)的。

1.2 成員內(nèi)部類(lèi)

  成員內(nèi)部類(lèi)可用訪(fǎng)問(wèn)修飾符修飾,比如public private和默認(rèn)。實(shí)際開(kāi)發(fā)中,為了保護(hù)內(nèi)部類(lèi),將內(nèi)部類(lèi)用private修飾,不讓外界直接訪(fǎng)問(wèn),這樣只能在該其外部類(lèi)使用這個(gè)內(nèi)部類(lèi)。

  成員內(nèi)部類(lèi)還能用static修飾,

  (1)當(dāng)不加static修飾時(shí),成員內(nèi)部類(lèi)中不能有靜態(tài)成員,并且外部類(lèi)和外界訪(fǎng)問(wèn)該內(nèi)部類(lèi)的方法如下:

  外部類(lèi)名.內(nèi)部類(lèi)名 對(duì)象名 = 創(chuàng)建外部類(lèi)對(duì)象.創(chuàng)建內(nèi)部類(lèi)對(duì)象。例如:

public class Outer { private int num = 100; public class Inner { // 成員內(nèi)部類(lèi) public void showNum() { System.out.println(num); } } public void show() { // 在外部類(lèi)中可以直接寫(xiě)Inner Inner i = new Outer().new Inner(); i.showNum(); }}

  Demo使用類(lèi)中:

public class Demo { public static void main(String[] args) { Outer outer = new Outer(); outer.show(); // 外界必須寫(xiě)成Outer.Inner Outer.Inner i = new Outer().new Inner(); i.showNum(); }}

  (2)當(dāng)用static修飾時(shí),成員內(nèi)部類(lèi)中只能訪(fǎng)問(wèn)外部類(lèi)的靜態(tài)成員;內(nèi)部類(lèi)中靜態(tài)和實(shí)例成員都能有(實(shí)例方法也只能訪(fǎng)問(wèn)外部類(lèi)的靜態(tài)成員),并且這時(shí)外界訪(fǎng)問(wèn)更加方便,格式如下:

  使用內(nèi)部類(lèi)靜態(tài)方法,直接用:外部類(lèi)名.內(nèi)部 類(lèi)名.方法名();

  使用內(nèi)部類(lèi)實(shí)例方法:

  1.創(chuàng)建內(nèi)部類(lèi)對(duì)象格式:

    外部類(lèi)名.內(nèi)部類(lèi)名 對(duì)象名 = new 外部類(lèi)名.內(nèi)部類(lèi)名();

  2.使用實(shí)例方法:對(duì)象名.實(shí)例方法名()。

  例子:

  外部類(lèi)Outer:

public class Outer { private int num1 = 100; private static int num2 = 200; public static class Inner { // 內(nèi)部類(lèi)靜態(tài)方法 public static void showStaticNum() { System.out.println(num2); // 只能訪(fǎng)問(wèn)外部靜態(tài)變量 } // 內(nèi)部類(lèi)實(shí)例方法 public void showNum() { System.out.println(num2); // 實(shí)例方法也只能訪(fǎng)問(wèn)外部變量 } } public void showInner() { // 外部類(lèi)中Outer.都能省略 Inner.showStaticNum(); // 直接調(diào)用內(nèi)部類(lèi)靜態(tài)方法 // 創(chuàng)建對(duì)象調(diào)用內(nèi)部類(lèi)實(shí)例方法 Inner inner = new Inner(); inner.showNum(); }}

  Demo使用類(lèi):

public class Demo { public static void main(String[] args) { // 測(cè)試外部類(lèi)訪(fǎng)問(wèn) Outer outer = new Outer(); outer.showInner(); // 外界訪(fǎng)問(wèn)不能省略O(shè)uter. Outer.Inner.showStaticNum(); Outer.Inner inner = new Outer.Inner(); inner.showNum(); }}

  案例補(bǔ)充:

public class Outer { public int num = 10; public class Inner { public int num = 20; public void show() { int num = 30; System.out.println(num); // 直接訪(fǎng)問(wèn)的是本局部變量的num,值是30 System.out.println(this.num); // 用this.num訪(fǎng)問(wèn)的是內(nèi)部類(lèi)的num,值是20 System.out.println(Outer.this.num); // 用Outer.this.num表示的是外部類(lèi)的num,而不能用Outer.num } }}

1.3 局部?jī)?nèi)部類(lèi)

  局部?jī)?nèi)部類(lèi)不能寫(xiě)任何修飾符,包括public和private。同樣,局部?jī)?nèi)部類(lèi)也不能用static關(guān)鍵字修飾,并且局部?jī)?nèi)部類(lèi)中也不能有靜態(tài)成員。

  在類(lèi)的靜態(tài)方法和實(shí)例方法中都可以寫(xiě)局部?jī)?nèi)部類(lèi),局部?jī)?nèi)部類(lèi)只能在包含該局部?jī)?nèi)部類(lèi)的方法中使用,在該方法中創(chuàng)建局部?jī)?nèi)部類(lèi)對(duì)象并使用,外部的別的地方無(wú)法直接使用。

  例子:

  (1)Outer類(lèi)

public class Outer { private int num1 = 100; private static int num2 = 200; public static void staticMethod() { // 靜態(tài)方法中的內(nèi)部類(lèi) class Inner1 { // 內(nèi)部類(lèi)的方法 public void show() { System.out.println(num2); // 靜態(tài)方法中的內(nèi)部類(lèi)只能外部類(lèi)的訪(fǎng)問(wèn)靜態(tài)變量 } } // 在該方法中使用內(nèi)部類(lèi) Inner1 inner1 = new Inner1(); inner1.show(); } public void instanceMethod() { // 實(shí)例方法中的內(nèi)部類(lèi) class Inner2 { public void show() { System.out.println(num1 + num2); // 都可訪(fǎng)問(wèn),這是正常的 } } // 同樣在該方法中使用內(nèi)部類(lèi) Inner2 inner2 = new Inner2(); inner2.show(); }}

  (2)Demo測(cè)試類(lèi)

public class Demo { public static void main(String[] args) { // 測(cè)試 Outer outer = new Outer(); outer.staticMethod(); // 200 outer.instanceMethod(); // 300 }}

  特別需要注意的是,如果局部?jī)?nèi)部類(lèi)中想要訪(fǎng)問(wèn)該方法的局部變量,那么必須將這個(gè)變量用final關(guān)鍵字修飾。原因:局部變量在外部類(lèi)的這個(gè)方法中,該方法一旦執(zhí)行完畢,變量就會(huì)被銷(xiāo)毀釋放,那么內(nèi)部類(lèi)就無(wú)法訪(fǎng)問(wèn)了,因此會(huì)出錯(cuò)。所以需要把內(nèi)部類(lèi)訪(fǎng)問(wèn)的局部變量用final關(guān)鍵字修飾,將這個(gè)變量提升為“類(lèi)”的字段。如果不加,JDK8會(huì)自動(dòng)加上隱含的final。建議還是自己加上。(這里所說(shuō)的局部變量是外部類(lèi)的包含這個(gè)局部?jī)?nèi)部類(lèi)方法中的變量,而不是內(nèi)部類(lèi)自己的方法中的局部變量)

  例子:

  (1)Outer類(lèi)

public class Outer { public void method() { final int num = 100; // 用final修飾將要被局部?jī)?nèi)部類(lèi)訪(fǎng)問(wèn)的變量 // 定義局部?jī)?nèi)部類(lèi) class Inner { public void show() { System.out.println(num); } } // 使用局部?jī)?nèi)部類(lèi) Inner inner = new Inner(); inner.show(); }}

  (2)Demo測(cè)試類(lèi)

public class Demo { public static void main(String[] args) { // 測(cè)試 Outer outer = new Outer(); outer.method(); }}

1.4 匿名內(nèi)部類(lèi)

  匿名內(nèi)部類(lèi)就是沒(méi)有名字的內(nèi)部類(lèi),他的作用是簡(jiǎn)化內(nèi)部類(lèi)的書(shū)寫(xiě)。寫(xiě)匿名內(nèi)部類(lèi)的前提是有一個(gè)類(lèi)或者接口。匿名內(nèi)部類(lèi)的格式:

  new類(lèi)名或者接口名(){

    可重寫(xiě)方法;

  };

  上述就是一個(gè)匿名內(nèi)部類(lèi),匿名內(nèi)部類(lèi)的本質(zhì)就是一個(gè)繼承了該類(lèi)或者實(shí)現(xiàn)了該接口的子類(lèi)匿名對(duì)象。比如:

new Date(){ // 這里沒(méi)有重寫(xiě)方法};

  就是一個(gè)匿名內(nèi)部類(lèi),并且返回的是繼承了Date類(lèi)的一個(gè)匿名子類(lèi)對(duì)象。然后可以直接使用這個(gè)對(duì)象,比如:

new Date(){}.getTime();

  可以輸出當(dāng)前時(shí)間。看似和:new Date().getTime();的效果是一樣的,實(shí)際上不同。使用匿名內(nèi)部類(lèi)可以重寫(xiě)方法,比如如果這樣寫(xiě),得到的就不是當(dāng)前時(shí)間的毫秒值了,而是1L。

new Date(){ public long getTime() { return 1L; }}.getTime();

  并且,使用匿名內(nèi)部類(lèi),可以在需要接口或者父類(lèi)參數(shù)的地方,創(chuàng)建一個(gè)匿名內(nèi)部類(lèi),以參數(shù)的方式傳遞進(jìn)去。在Android中就有很多這樣的用法。因?yàn)槟涿麅?nèi)部類(lèi)使用一次。使用完后立即釋放,不占用太多資源。如果需要多次使用這個(gè)對(duì)象,那么建議還是創(chuàng)建一個(gè)類(lèi)繼承類(lèi)或者實(shí)現(xiàn)接口。當(dāng)然,也可以先將這個(gè)匿名內(nèi)部類(lèi)賦給一個(gè)對(duì)象,然后多次調(diào)用,比如:

  (1)Fly接口

public interface Fly { void fly();}

  (2)Demo類(lèi)

public class Demo { public static void main(String[] args) { Fly fly = new Fly() { public void fly() { System.out.println("I can fly!"); } }; // 可多次調(diào)用 fly.fly(); fly.fly(); }}

  這種方式只適合在一個(gè)文件中使用。

2 Eclipse的使用

2.1 基本使用

  Eclipse是java集成開(kāi)發(fā)環(huán)境,免費(fèi),開(kāi)源,綠色,可擴(kuò)展。

  Eclipse中有多個(gè)視圖,比如有Java視圖、Debug視圖。每個(gè)視圖有多種視窗,主要有

  (1)Package Explorer:包資源管理器,顯示項(xiàng)目結(jié)構(gòu)以及所有源文件。

  (2)OutLine:顯示類(lèi)的結(jié)構(gòu),方便查看、定位等。如圖:

  主體顏色(紅/綠)代表修飾符,右上角的C表示構(gòu)造方法,F(xiàn)表示以final修飾,S代表static修飾。

  (3)Console:顯示控制臺(tái)輸出信息。

  (4)Type Hierarchy:顯示Java繼承層次結(jié)構(gòu),選中java文件后按F4即可查看。

  (5)Eclipse代碼區(qū):紅色標(biāo)記表示錯(cuò)誤,橙色表示警告。

  使用:開(kāi)啟時(shí)選擇工作空間,再新建:Java Project?Package?Class。

  Eclipse會(huì)在每次保存Java文件時(shí)自動(dòng)將.java文件編譯成.class文件。

2.2 常用設(shè)置

  (1)顯示行號(hào):代碼左邊的區(qū)域,右鍵Show Line Numbers即可

  (2)導(dǎo)入項(xiàng)目文件夾:右鍵?import?General?Existing Project into Workspace?選擇文件夾/zip文件等?完成。

  (3)設(shè)置文檔為UTF-8編碼:Project->Proporties->Resource出現(xiàn)的Text file encoding選擇Other的UTF-8。

  (4)設(shè)置字體大小:Window -> Preferences -> General -> Appearance -> Colors and Fonts中的Basic,選中Text Font,點(diǎn)擊Edit按鈕編輯字體設(shè)置即可。

  (5)設(shè)置代碼提示:Window -> Preferences -> Java -> Editor -> Content Assist中,在“Auto activation triggers for java”里面填上所有的字母。

2.3 常用快捷鍵

  (1)代碼提示:Alt + /;

  (2)格式化代碼:Ctrl + Shift + F

  (3)導(dǎo)包:Ctrl + Shift + O,如果有多個(gè)包存在同名的類(lèi),則要選擇。

  (4)注釋?zhuān)簡(jiǎn)涡凶⑨專(zhuān)篊trl + /。如果想取消,再來(lái)一次。

    多行注釋?zhuān)篊trl + Shift + /。取消:Ctrl + Shift + /。

  (5)查看源代碼:選中代碼,按F3或者Ctrl + 鼠標(biāo)點(diǎn)擊。【JDK目錄下有src.zip文件,里面包含了源代碼,不要?jiǎng)h除,否則IDE會(huì)找不到源碼

  (6)如何使用Source中的快捷鍵:按下Alt + Shift + S,再看下滑線(xiàn)字母進(jìn)行選擇。

2.4 Eclipse中導(dǎo)出jar包和使用jar包

  (1)將源碼導(dǎo)出為jar包。右鍵項(xiàng)目?Export…?Java?JAR file?Next?選擇導(dǎo)出jar文件的名稱(chēng)和路徑?完成。為了讓人使用自己的jar包,還需要給出說(shuō)明書(shū)。生成說(shuō)明書(shū)的方法:右鍵項(xiàng)目?Export…?Javadoc?選擇輸出路徑?完成。

  (2)使用別人的jar包:在項(xiàng)目下新家一個(gè)lib文件夾專(zhuān)門(mén)用于存放第三方j(luò)ar包,把需要的jar包復(fù)制進(jìn)文件夾中。然后,右鍵這個(gè)jar包?Build Path?Add to Build Path,這樣就能使用jar包中的類(lèi)了。如果不依賴(lài)于IDE,實(shí)際上只要將jar包配置到classpath路徑下,就能使用jar包了。

2.5 調(diào)試程序

  調(diào)試程序就是設(shè)置斷點(diǎn),程序運(yùn)行到斷點(diǎn)的地方會(huì)停止,然后可以查看這時(shí)的變量狀態(tài)以便找出程序的出錯(cuò)位置和出錯(cuò)原因。

  調(diào)試的方法:

  雙擊一行代碼的左側(cè)設(shè)置斷點(diǎn),然后Debug as調(diào)試程序,會(huì)彈出是否進(jìn)入Debug視圖的選擇框,選擇“Yes”進(jìn)入Debug視圖。運(yùn)行到斷點(diǎn)時(shí)可以使用Step Over(F6)逐行調(diào)試。Variables視窗可以觀察變量值的變化。如果想監(jiān)視表達(dá)式和變量,則打開(kāi)Expressions選項(xiàng)卡:Window ? Show View ? Expressions。再次雙擊斷點(diǎn)會(huì)取消斷點(diǎn)。

  通過(guò)觀看多個(gè)函數(shù)的逐步調(diào)試調(diào)用過(guò)程,可以知道函數(shù)的入棧和出棧。

3 異常

3.1 異常介紹

  異常就是程序出現(xiàn)了不正常的情況。比如執(zhí)行Integer.parseInt(“abc”)時(shí),由于程序無(wú)法將abc轉(zhuǎn)換成數(shù)字,因此會(huì)出現(xiàn)異常。

  Java中,異常類(lèi)叫Throwable,他有兩個(gè)子類(lèi),分別是Error和Exception。

  Error錯(cuò)誤可不處理,比如內(nèi)存溢出的Error(OutOfMemoryError);而Exception中又分為RuntimeException(運(yùn)行時(shí)異常)和非RuntimeException(非運(yùn)行時(shí)異常)的異常。運(yùn)行時(shí)異常一般是代碼不嚴(yán)謹(jǐn)導(dǎo)致的,可手動(dòng)處理;而非運(yùn)行時(shí)異常是編譯期異常,必須進(jìn)行處理,否則代碼不能編譯通過(guò)。

  若程序出現(xiàn)異常,JVM會(huì)做出默認(rèn)處理,會(huì)輸出異常的信息并立即結(jié)束程序。

  異常體系圖:

3.1.1 Exception類(lèi)

  Exception類(lèi)中主要的方法:

  public String getMessage():返回異常消息的字符串

  public String toString():返回異常的簡(jiǎn)單信息描述,包括:此對(duì)象的完整類(lèi)名和調(diào)用getMessage()返回的內(nèi)容。

  public void printStackTrace():獲取異常類(lèi)名、異常信息和出現(xiàn)異常的位置,并輸出這些信息。看起來(lái)在catch中使用printStackTrace()方法和程序出現(xiàn)異常的結(jié)果沒(méi)有什么不同,但是注意:有了try…catch處理后,程序還會(huì)繼續(xù)執(zhí)行,而如果不進(jìn)行異常處理,那么程序遇到異常就直接輸出異常信息并結(jié)束。

3.2 處理異常

  有時(shí)我們需要自行處理異常,如果讓JVM默認(rèn)處理,那么一旦程序出現(xiàn)異常就會(huì)立即停止運(yùn)行。處理異常有兩種方式,一種是自行處理,另一種是拋出異常。

3.2.1 自行處理

  使用try…catch…finally捕獲處理異常。格式:

try{ 可能出現(xiàn)異常的代碼; ...} catch(異常類(lèi)型名 變量名){ 如果程序出現(xiàn)異常,就會(huì)執(zhí)行這里的代碼塊 這里會(huì)捕獲到異常,可進(jìn)行處理...} finally{ 不管程序是否有異常,都會(huì)執(zhí)行這里的語(yǔ)句,一般用于釋放資源}

  通常,try里面包含的代碼塊盡量的少,以便準(zhǔn)確定位異常。

  其中,finally及其代碼塊可不寫(xiě),如果這段代碼有多個(gè)異常要處理,可以寫(xiě)多個(gè)catch來(lái)分別處理不同的異常,形式類(lèi)似于:try{…}catch(){…}catch(){…}。需要注意:如果這些異常有父子類(lèi)關(guān)系,則必須先捕獲處理子類(lèi)異常,再處理父類(lèi)異常。因?yàn)闀?huì)先匹配前面的異常,出現(xiàn)異常,try中就不執(zhí)行了,而是執(zhí)行catch中代碼,如果有finally,再執(zhí)行其中的代碼,最后,會(huì)繼續(xù)執(zhí)行程序中其他代碼。

  上述格式還能簡(jiǎn)化成:

try{ catch(異常類(lèi)型1 變量1 | 異常類(lèi)型2 變量2 | ...){ ... }}

  這是JDK7支持的新方案。但是這樣就是為所有的異常執(zhí)行相同的處理方法,而且各個(gè)異常間不能有父子類(lèi)關(guān)系,也就是要“平級(jí)”的。

3.2.2 拋出異常

  拋出異常,適用于現(xiàn)在不適合處理或是沒(méi)有權(quán)限處理的異常。用關(guān)鍵字throws向上拋出異常,讓方法的調(diào)用者來(lái)處理異常。拋出異常要寫(xiě)在方法形參的一對(duì)小括號(hào)后邊,格式:

  throws 異常類(lèi)名。

  例如:public void readFile(String file) throws IOException{…}。

  當(dāng)然,如果拋出非運(yùn)行時(shí)異常(編譯期異常),則調(diào)用者必須處理,如果拋出運(yùn)行時(shí)異常,調(diào)用者可以不處理。

3.2.3 自定義異常

  實(shí)際開(kāi)發(fā)中,可以自定義異常類(lèi)。自定義異常類(lèi)必須繼承Exception(編譯期異常)或者RuntimeException(運(yùn)行期異常)類(lèi)。

  例子:

  (1)自定義異常類(lèi):

package com.zhang.test;public class MyException extends Exception { public MyException() {} public MyException(String message) { // 自定義異常只需要繼承并寫(xiě)構(gòu)造方法 // 該構(gòu)造調(diào)用父類(lèi)構(gòu)造目的是顯示錯(cuò)誤信息 super(message); }}

  (2)教師類(lèi)中用到了自定義異常并拋出此異常對(duì)象。注意:throw關(guān)鍵字是主動(dòng)拋出異常,拋出的是異常的對(duì)象,使用throw則一定會(huì)有異常。而throws是向上拋出可能出現(xiàn)的異常,由調(diào)用者處理可能出現(xiàn)的異常。

  由于MyException繼承了Exception,而不是RuntimeException,所以所在方法必須處理異常,可以?huà)伋觥?/p>package com.zhang.test;public class Teacher { public void checkScore(int score) throws MyException { if(score < 0 || score > 100) { // 這里拋出異常 throw new MyException(); } }}

  (3)主方法可處理異常

package com.zhang.test;public class Demo { public static void main(String[] args) { Teacher teacher = new Teacher(); try{ teacher.checkScore(1000); } catch (MyException e) { e.printStackTrace(); } }}

3.2.4 細(xì)節(jié)

  (1)子類(lèi)重寫(xiě)父類(lèi)方法時(shí),必須拋出相同的異常或父類(lèi)異常的子類(lèi)異常,而不能拋出父類(lèi)沒(méi)有的異常。如果被重寫(xiě)的父類(lèi)方法沒(méi)有異常拋出,那么子類(lèi)的方法絕對(duì)不可以?huà)伋霎惓!_@時(shí)如果子類(lèi)方法內(nèi)需要處理異常,只能用try…catch方式處理,不能throws拋出。

  (2)使用多態(tài)機(jī)制處理異常:比如當(dāng)一段代碼有多個(gè)異常類(lèi)需要處理時(shí),可以直接處理Exception類(lèi)異常即可,或者直接拋出Exception異常,因?yàn)檫@是所有需要處理的異常的父類(lèi)。   


本篇文章已結(jié)束,若您喜歡,歡迎支持我的工作。

支付寶

微信


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 颍上县| 陇南市| 旬阳县| 雷波县| 兴隆县| 海门市| 南木林县| 娱乐| 营山县| 林口县| 甘洛县| 淳安县| 宜宾县| 晴隆县| 和田县| 平山县| 陵水| 论坛| 齐齐哈尔市| 读书| 南丹县| 筠连县| 蒙阴县| 沧源| 昭平县| 南和县| 陆川县| 新乐市| 德州市| 军事| 全南县| 康乐县| 连南| 莱州市| 德保县| 昂仁县| 青龙| 博湖县| 株洲县| 顺昌县| 平乡县|