一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java內部類和異常類的概念以及使用

Java內部類和異常類的概念以及使用

2021-09-06 10:13Codeplus. Java教程

這篇文章主要介紹了Java內部類和異常類的概念以及使用,文中有非常詳細的代碼以及注釋,適合正在學習java基礎的同學們使用,需要的朋友可以參考下

1 內部類

java支持在一個類中聲明另一個類,這樣的類稱作內部類,而包含內部類的類成為內部類的外嵌類。

內部類的類體中不可以聲明類變量和類方法。外嵌類的類體中可以用內部類聲明對象,作為外嵌類的成員。

內部類的使用規則:
(1)聲明內部類如同在類中聲明方法或變量一樣,一個類把內部類看作是自己的成員。
(2)外嵌類的類體中可以用內部類聲明的對象,作為外嵌類的成員。
(3)外嵌類的成員變量在內部類中仍然有效,內部類中的方法也可以調用外嵌類中的方法。
(4)內部類的類體中不可以聲明類變量和方法。
(5)外嵌類和內部類在編譯時,生成兩個.class文件。

例如:某種類型的農場飼養了一種特殊種類的牛,但不希望其他農場飼養這種特殊種類的牛,那么這種類型的農場就可以將創建這種特殊種牛的類作為自己的內部類。
下面的例子1(example1.1.java)中有一個redcowform(紅牛農場)類,該類中有一個名字為redcow (紅牛)的內部類。

redcowform.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class redcowform {
    static string formname;
    redcow cow;  //內部類聲明對象
 
    redcowform() {
    }
 
    redcowform(string s) {
        cow = new redcow(150, 112, 5000);
        formname = s;
    }
 
    public void showcowmess() {
        cow.speak();
    }
 
    class redcow {  //內部類的聲明
        string cowname = "紅牛";
        int height, weight, price;
 
        redcow(int h, int w, int p) {
            height = h;
            weight = w;
            price = p;
        }
 
        void speak() {
            system.out.println("偶是" + cowname + ",身高:" + height + "cm 體重:" + weight + "kg,生活在" + formname);
        }
    }    //內部類結束
}
115526523

example1.1.java

?
1
2
3
4
5
6
7
public class example1_1 {
    public static void main(string[] args) {
        redcowform form = new redcowform("紅牛農場");
        form.showcowmess();
        form.cow.speak();
    }
}

需要特別注意的是,java編譯器生成的內部類的字節碼文件的名字和通常的類不同,內部類對應的字節碼文件的名字格式是“外嵌類名$ 內部類名”,例如,例子1中內部類的字節碼文件是redcowform$redcow.class。因此,當需要把字節碼文件復制給其他開發人員時,不要忘記了內部類的字節碼文件。
內部類可以被修飾為static 內部類,例如,例子1中的內部類聲明可以是static classredcow。類是一種數據類型,那么static內部類就是外嵌類中的一-種靜 態數據類型,這樣一來,程序就可以在其他類中使用static內部類來創建對象了。但需要注意的是,static 內部類不能操作外嵌類中的實例成員變量。

假如將例子1中的內部類redcow更改成static內部類,就可以在例子1的example1_ 1
主類的main方法中增加如下的代碼。

?
1
2
redcowform.redcow redcow = new redcowform.redcow(180,119,6000);
        redcow.speak();

注意:非內部類不可以是static類

2 匿名類

2.1 和子類有關的匿名類

創建子類對象時,除了使用父類的構造方法外還有類體,此類體被認為是一個子類去掉類聲明后的類體,稱作匿名類。

假設bank是類,那么下列代碼就是用bank的一個子類(匿名類)創建對象:

?
1
2
3
new bank() {
    匿名類的類體
};

和子類有關的匿名類:
(1)匿名類是一個子類,由于無名可用,所以不可能用匿名類聲明對象,但卻可以直接用匿名類創建一個對象。
(2)匿名類可以繼承父類的方法也可以重寫父類的方法。
(3)使用匿名類時,必然是在某個類中直接用匿名類創建對象,以此,匿名類一定是內部類。
(4)匿名類可以訪問外嵌類中的成員變量和方法,匿名類的類體中不可以聲明static成員變量和static方法。
(5)由于匿名類是一個子類,但沒有類名,所以在用匿名類創建對象時,要直接使用父類的構造方法。

例子2:該類共有4個類: (example2_1. java)、showboard類、
outputalphabet類型、 outputenglish. java 。該匿名類的對象負責輸出希臘字母表。

outputalphabet.java

?
1
2
3
abstract class outputalphabet {
    public abstract void output();
}

outputalphabet .java

?
1
2
3
4
5
6
7
public class outputenglish extends outputalphabet { //輸出英文字母子類
    public void output(){
        for (char c='a';c<='z';c++){
            system.out.printf("%3c",c);
        }
    }
}

showboard .java

?
1
2
3
4
5
public class showboard {
    void showmess(outputalphabet show) { //參數show是outputalphabet類型的對象
        show.output();
    }
}

example2_1.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class example2_1 {
    public static void main(string[] args) {
        showboard board = new showboard();
        board.showmess(new outputenglish());//向參數傳遞outputalphabet的子類outputenglish的對象
 
        board.showmess(new outputalphabet() {   //向參數傳遞outputalphabet的匿名子類的對象
            @override
            public void output() {
                for (char c = 'α'; c <= 'ω'; c++)  //輸出希臘字母
                    system.out.printf("%3c", c);
            }
        });//分號在這里
    }
}

Java內部類和異常類的概念以及使用

2.2 和接口有關的匿名類

和接口有關的匿名類
假設computable是一個接口,那么,java允許直接用接口名和一個類體創建一個匿名對象,此類體被認為是實現了computable接口的類去掉類聲明后的類體,稱作匿名類。

下列代碼就是用實現了computable接口的類(匿名類)創建對象:

?
1
2
3
new computable(){
    實現接口的匿名類的類體
};

下面例子演示了和接口有關的匿名類的用法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
interface speakhello {
    void speak();
}
 
class hellomachine {
    public void turnon(speakhello hello) {
        hello.speak();
    }
}
 
public class example7_3 {
    public static void main(string[] args) {
        hellomachine machine = new hellomachine();
        machine.turnon(new speakhello() {
            @override
            public void speak() {
                system.out.println("hello,you are welcome!");
            }
        });
        machine.turnon(new speakhello() {
            @override
            public void speak() {
                system.out.println("你好,歡迎光臨!");
            }
        });
    }
}

Java內部類和異常類的概念以及使用

3 異常類

所謂異常就是程序運行時可能出現一些錯誤,比如試圖打開一個根本不存在的文件等,異常處理將會改變程序的控制流程,讓程序有機會對錯誤作出處理。程序運行出現異常時,java運行環境就用異常類exception的相應子類創建一個異常對象,并等待處理。異常對象可以調用如下方法得到或輸出有關異常的信息:

異常對象可以調用如下方法得到或輸出有關異常的信息:

?
1
2
3
public string getmessage();
public void printstacktrace();
public string tostring();

3.1 try-catch語句

java使用try-catch語句來處理異常,將可能出現的異常操作放在try-catch語句的try部分,將發生異常后的處理放在catch部分。
try-catch語句的格式如下:

?
1
2
3
4
5
6
7
8
9
try{
    包含可能發生異常的語句
}
catch(exceptionsubclass1 e){
    ...
}
catch(exceptionsubclass2 e){
    ...
}

下面一個例子給出了try-catch語句的用法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class example3_1 {
    public static void main(string[] args) {
        int n = 0, m = 0, t = 1000;
 
        try {
            m = integer.parseint("8888");
            n = integer.parseint("ab89"); //發生異常,轉向catch
            t = 7777//t沒有機會被賦值
        } catch (numberformatexception e) {
            system.out.println("發生異常:" + e.getmessage());
        }
        system.out.println("n=" + n + ",m=" + m + ",t=" + t);
 
        try {
            system.out.println("故意拋出i/o異常!");
            throw new java.io.ioexception("我是故意的");
            //system.out.println("這個輸出語句肯定沒有機會執行,所以必須注釋掉,否則編譯出錯");
        } catch (java.io.ioexception e) {
            system.out.println("發生異常:" + e.getmessage());
        }
    }
}

Java內部類和異常類的概念以及使用

帶finally子語句的try~catch語句,語法格式如下:

?
1
2
3
try{ }
catch(exceptionsubclass e){ }
finally{}

其執行機制是在執行try~catch語句后,執行finally 子語句,也就是說,無論在try部分是否發生過異常,finally 子語句都會被執行

3.2 自定義異常類

(1)一個方法不處理它產生的異常,而是沿著調用層次向上傳遞,由調用它的方法來處理這些異常,叫聲明異常.

聲明異常的方法:
在產生異常的方法名后面加上要拋出(throws)的異常的列表:

如: void compute(int x) throwsari thmeticexception
{//這里有異常發生,但是并沒有處理…}

(2)我們也可以擴展exception類定義自己的異常類,然后規定哪些方法產生這樣的異常。一個方法在聲明時可以使用throws關鍵字聲明要產生的若干個異常,并在該方法的方法體中具體給出產生異常的操
作,即用相應的異常類創建對象,并使用throw關鍵字拋出該異常對象,導致該方法結束執行。

(3)通常情況下,計算兩個整數之和的方法不應當有任何異常放出,但是,對某些特殊應程序,可能不允許同號的整數做求和運算,比如當一個整數代表收入,一個整數代表支出時,這兩個整數就不能是同號。

例子 (example3_2. java)中,bank類中有一個income(int in, int out)方法,對象調用該方法時,必須向參數in傳遞正整數、向參數out傳遞負數,并且int+out必須大于等于0,否則該方法就拋出異常( bankexception. java )。因此,bank類在聲明income(int in, int out)方法時,使用throws關鍵字聲明要產生的異常。

bankexception.java

?
1
2
3
4
5
6
7
8
9
10
11
public class bankexception extends exception {
    string message;
 
    public bankexception(int m, int n) {
        message = "入賬資金" + m + "是負數或支出" + n + "是正數,不符合系統要求.";
    }
 
    public string warnmess() {
        return message;
    }
}

bank.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class bank {
    private int money;
 
    public void income(int in, int out) throws bankexception {
        if (in <= 0 || out >= 0 || in + out <= 0) {
            throw new bankexception(in, out); //方法拋出異常,導致方法結束
        }
        int netincome = in + out;
        system.out.printf("本次計算出的純收入是:%d元\n", netincome);
        money = money + netincome;
    }
 
    public int getmoney() {
        return money;
    }
}

example3_2.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class example3_2 {
    public static void main(string[] args) {
        bank bank = new bank();
        try {
            bank.income(200, -100);
            bank.income(300, -100);
            bank.income(400, -100);
            system.out.printf("銀行目前有%d元\n", bank.getmoney());
            bank.income(200, 100);
            bank.income(99999, -100);
        } catch (bankexception e) {
            system.out.println("計算收益的過程出現如下問題:");
            system.out.println(e.warnmess());
        }
        system.out.printf("銀行目前有%d元\n", bank.getmoney());
    }
}

Java內部類和異常類的概念以及使用

4 斷言

斷言語句用于調試代碼階段。在調試代碼階段讓斷言語句發揮作用,這樣就可以發現一些致命的錯誤,當程序正式運行時就可以關閉斷言語句,但仍把斷言語句保留在源代碼中,如果以后應用程又需要調試,可以重新啟用斷言語句。

使用關鍵字assert聲明一條斷言語句,斷言語句有以下兩種格式:

assert booleanexpression;

assert booleanexpression:messagelexception;

啟用與關閉斷言語句
當使用java解釋器直接運行應用程序時,默認地關閉斷言語句,在調試程序時可以使用-ea啟用斷言語句,例如:
java -ea mainclass

例子4中,使用一個數組放著某學生5門課程的成績,程序準備計算學生的成績的總和。在調試程序時使用了斷言語句,如果發現成績有負數,程序立刻結束執行。程序調試開啟斷言語句運行效果如圖4.1,關閉斷言語句運行效果如圖4.2。

?
1
2
3
4
5
6
7
8
9
10
11
12
import java.util.scanner;
public class example4 {
  public static void main (string args[ ]) {
       int [] score={-120,98,89,120,99};
       int sum=0;
       for(int number:score) {
          assert number>0:"負數不能是成績";
          sum=sum+number;
       }
       system.out.println("總成績:"+sum);   
   }
}

圖4.1

Java內部類和異常類的概念以及使用

圖4.2

Java內部類和異常類的概念以及使用

5 綜合案例

下面的例子5中模擬向貨船上裝載集裝箱,如果貨船超重,那么貨船認為這是一個異常將拒絕裝載集裝箱,但無論是否發生異常,貨船都需要正點啟航

dangerexception.java

?
1
2
3
4
5
6
public class dangerexception extends exception {
    final string message = "超重";
    public string warnmess() {
        return message;
    }
}

cargoboat.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class cargoboat {
    int realcontent;  //裝載的重量
    int maxcontent;   //最大裝載量
    public void setmaxcontent(int c) {
        maxcontent = c;
    }
    public void loading(int m) throws dangerexception {
        realcontent += m;
        if(realcontent>maxcontent) {
            throw new dangerexception();
        }
        system.out.println("目前裝載了"+realcontent+"噸貨物");
    }
}

example5.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class example5 {
    public static void main(string[] args) {
        cargoboat ship = new cargoboat();
        ship.setmaxcontent(1000);
        int m =600;
        try{
            ship.loading(m);
            m = 400;
            ship.loading(m);
            m = 367;
            ship.loading(m);
            m = 555;
            ship.loading(m);
        }
        catch(dangerexception e) {
            system.out.println(e.warnmess());
            system.out.println("無法再裝載重量是"+m+"噸的集裝箱");
        }
        finally {
            system.out.printf("貨船將正點啟航");
        }
    }
}

Java內部類和異常類的概念以及使用

到此這篇關于java內部類和異常類的概念以及使用的文章就介紹到這了,更多相關java類的使用內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/m0_46518461/article/details/115526523

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: а天堂中文最新版在线 | 白丝女榨干蹂躏我 | 香蕉免费看一区二区三区 | 毛片在线看网站 | 单亲乱l仑在线观看免费观看 | 精品国产一区二区三区久久久狼 | 亚洲欧美成人综合在线 | 性刺激欧美三级在线现看中文 | 国产一区二区三区欧美 | 精品无码人妻一区二区免费AV | 91精品国产综合久 | 免费视频亚洲 | 四虎导航 | 国产福利在线观看第二区 | 百合互慰吃奶互揉漫画 | 2021小妲己永久回家地址 | 欧美最猛性xxxxx动态图 | 欧美国产日韩在线 | 成年美女黄网站色视频大全免费 | 色悠久久久久综合欧美99 | 美女被狂干 | 婷婷麻豆 | 欧美在线视频一区二区 | 精品视频在线免费播放 | 91短视频在线免费观看 | blacked在线播放 | 色99视频| 卫生间被教官做好爽HH视频 | 日本视频在线免费观看 | 国产欧美成人免费观看 | 久久精品国产免费播放 | 69日本人| 毛片免 | 亚洲ss | 国产精品合集一区二区 | 91中文在线 | 国产亚洲精品美女久久久 | 亚洲成人影院在线观看 | 好男人资源在线观看免费的 | 欧美一级在线全免费 | 日日操日日舔 |