久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術文章
文章詳情頁

淺談Java面向對象之內部類

瀏覽:4日期:2022-08-10 15:07:05
目錄內部類訪問外部對象訪問內部對象局部內部類匿名內部類靜態(tài)內部類內部類

內部類是定義在另一個類中的類,例如 TalkingClock 類中內嵌了 TimePrinter 類:

class TalkingClock{ private int interval; private boolean beep; public TalkingClock(int interval, boolean beep){} public void start(){} public class TimePrinter implements ActionListener{ public void actionPerformed(ActionEvent event){} }}

內部類可以對同一個包中的其他類隱藏細節(jié),同時內部類中的方法可以訪問原來的類中的作用域數(shù)據(jù)。

訪問外部對象

內部類可以訪問自身的數(shù)據(jù)字段,也可以訪問創(chuàng)建它的外圍類對象的數(shù)據(jù)字段。內部類會有一個隱式引用,指向創(chuàng)建它的外部類對象。

淺談Java面向對象之內部類

對外圍類的引用在構造器中設置,編譯器會修改所有內部類的構造器,添加一個對外部類引用的參數(shù)。使用外部類引用的語法為:

OuterClass.this

例如內部類 TimePrinter 引用外部類 TalkingClock 的 beep 參數(shù),嚴格來說要寫成這樣。

TalkingClock.this.beep訪問內部對象

使用內部類的構造器時,可以使用下面的語法來實現(xiàn):

outerObject.new InnerClass(construction parameters)

在外部類的作用域之外,想要引用內部類就需要用下面的語法:

OuterClass.InnerClass局部內部類

局部內部類類似方法的局部變量,在類外或者類的其他方法中不能訪問這個內部類。通常情況下可以在某個方法中局部實現(xiàn)一個類,這個類將用于輔助該方法的功能實現(xiàn)。例如:

public void start(){ class TimePrinter implements ActionListener{ public void actionPerformed(ActionEvent event){ System.out.println('The time is ' + Instant.ofEpochMilli(event.getWhen())); if (beep) {Toolkit.getDefaultToolkit().beep(); } } } TimePrinter listener = new TimePrinter(); TalkingClock timer = new Timer(interval, listener); timer.start();}

聲明局部類時不能有訪問說明符,局部類的作用域被限定在了這個局部類塊中。局部類可以做到對外界的絕對隱藏,這是個很大的優(yōu)勢。局部類還有個優(yōu)點,就是可以訪問局部變量。當局部變量傳參進來時,局部變量也會被傳入構造器,此時編譯器會為局部變量提供相應的實例字段,保存一個副本。這么做的好處是,當函數(shù)調用結束導致局部變量消失時,局部類還能夠使用這個局部變量。例如將上述的 start 方法改為傳入 2 個參數(shù),仍然不影響正常使用。

public void start(int interval, boolean beep)匿名內部類

使用局部類時,如果只是想建立這個局部類的一個對象,甚至不需要給出這個類的名字,這種類就成為匿名內部類。匿名內部類的語法為:

new SuperType(construction parameters){ inner class methods and data} new InterfaceType(){ methods and data}

SuperType 指的是超類,此時局部類就需要拓展這個類。匿名局部類可以基于接口創(chuàng)建,此時局部類就要實現(xiàn)這個接口。由于構造器的名字必須和類名相同,而匿名局部類沒有類名,因此匿名局部類不能有構造器,此時如果要構造參數(shù)就需要傳遞給超類的構造器。例如將上述的局部類改造成匿名內部類:

public void start(){ var listener = new ActionListener(){ public void actionPerformed(ActionEvent event){ System.out.println('The time is ' + Instant.ofEpochMilli(event.getWhen())); if (beep) {Toolkit.getDefaultToolkit().beep(); } } } TalkingClock timer = new Timer(interval, listener); timer.start();} 靜態(tài)內部類

有時候使用內部類只是想隱藏一個類,并不需要內部類有外部類的引用,因此可以用 static 關鍵字聲明靜態(tài)內部類。例如定義 ArrayAlg 類中實現(xiàn) minmax 方法,minmax 方法的功能是同時返回一個數(shù)組的最大值和最小值,但是用 return 只能返回一個值。因此可以定義一個靜態(tài)內部類 Pair,Pair 類有兩個參數(shù)可以分別存儲最大和最小值,這樣就可以通過返回 Pair 方法同時返回 2 個值了。

class ArrayAlg{ public static class Pair{ private double first; private double second; public Pair(double f, double s){ first = f; second = s; } public double getFirst() { return first; } public double getSecond() { return second; } } public static Pair minmax(double[] values){ double min = Double.POSITIVE_INFINITY; double max = Double.NEGATIVE_INFINITY; for (double v : values){ if (min > v) min = v; if (max < v) max = v; } return new Pair(min, max); }}

只要內部類不需要訪問外圍類對象,就應該聲明為靜態(tài)內部類。和其他內部類不同,靜態(tài)內部類可以有靜態(tài)字段和方法。

以上就是淺談Java面向對象之內部類的詳細內容,更多關于Java面向對象內部類的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 南京市| 天镇县| 枣庄市| 武定县| 古田县| 丰原市| 开阳县| 黄陵县| 漳平市| 桑植县| 铁岭市| 临澧县| 麻阳| 曲阳县| 浙江省| 方山县| 商丘市| 和林格尔县| 周宁县| 潍坊市| 林周县| 恩施市| 玉环县| 巩留县| 栖霞市| 临沭县| 冀州市| 色达县| 永平县| 民丰县| 屏东市| 法库县| 睢宁县| 上林县| 汶川县| 榆林市| 蕉岭县| 洛扎县| 屏南县| 阳江市| 松潘县|