Java內部類的定義和使用

為什么要用到內部類:

在java開發學習中我們經常會碰到內部類。內部類又有很多的優勢:首先舉一個簡單的例子,如果你想實現一個接口,但是這個接口中的一個方法和你構想的這個類中的一個方法名稱參數相同,你應該怎么辦?這時候,你可以建一個內部類實現這個接口。由于內部類對外部類的所有內容都是可訪問的,所以這樣做可以完成所有你直接實現這個接口的功能。不過你可能要質疑,更改一下方法的不就行了嗎?的確,以此作為設計內部類的理由,實在沒有說服力。真正的原因是這樣的,java中的內部類和接口加在一起,從而java 通過內部類加上接口,可以很好的實現多繼承的效果。

?

內部類的分類和使用

1、成員內部類: 即作為外部類的一個成員存在,與外部類的屬性、方法并列。注意:成員內部類中不能定義靜態變量,但可以訪問外部類的所有成員。值得注意的是成員內部類編譯成功后會生成的兩個不同的類(.class)
成員內部類的優點
1)、內部類作為外部類的成員,可以訪問外部類的私有成員或屬性。(即使將外部類聲明為PRIVATE,但是對于處于其內部的內部類還是可見的。)
2)、用內部類定義在外部類中不可訪問的屬性。這樣就在外部類中實現了比外部類的private還要小的訪問權限。
package one;public class Outer{private static int outer_i = 1;private int k=20;public static void outer1(){//...
    }//成員內部類class Inner{int j=100;//內部類中外部類的實例變量可以共存int inner_i=1;void inner1(){System.out.println(outer_i);//外部類的變量如果和內部類的變量沒有同名的,則可以直接用變量名訪問外部類的變量System.out.println(j);//在內部類中訪問內部類自己的變量直接用變量名System.out.println(this.j);//也可以在內部類中用"this.變量名"來訪問內部類變量//訪問外部類中與內部類同名的實例變量可用"外部類名.this.變量名"。System.out.println(k);//外部類的變量如果和內部類的變量沒有同名的,則可以直接用變量名訪問外部類的變量
           outer1();}}//外部類的非靜態方法訪問成員內部類public void outer2(){Inner inner = new Inner();inner.inner1();}//外部類的靜態方法訪問成員內部類,與在外部類外部訪問成員內部類一樣public static void outer3(){Outer out = new Outer();//step1 建立外部類對象Inner inner=out.new Inner();//step2 根據外部類對象建立內部類對象inner.inner1();//step3 訪問內部類的方法
    }public static void main(String[] args){outer3();}
}

?

2、局部內部類: 即在方法中定義的內部類,與局部變量類似,在局部內部類前不加修飾符public或private,其范圍為定義它的代碼塊。

?

public class Outer {public void say(){System.out.println("關門說真話!");}
}
public class Test {public void ting(){class MiMi extends Outer{//定義一個局部的內部類,繼承Outer方法//……
        }new MiMi().say();//調用局部內部類中繼承的say方法
        System.out.println("別人都不知道");}public static void main(String[] args) {new Test().ting();}
}

?

3、靜態內部類: 靜態內部類定義在類中,任何方法外,用static定義。注意:靜態內部類中可以定義靜態或者非靜態的成員

package three;public class StaticTest {  private static String name="abc";private String sex="男";static class Person{private String age = "18";//內部私有成員public String heigth = "180";//內部類公有成員public void display(){//System.out.println(sex);//報錯,不能直接訪問外部類的非靜態成員System.out.println(name);//只能直接訪問外部類的靜態成員System.out.println(age);//訪問本內部類成員。
        }  }public void testone(){Person person = new Person();person.display();//System.out.println(heigth);//報錯,是因為不可以直接訪問內部類私有成員//System.out.println(age);//報錯,是因為不可以直接訪問內部類公有成員System.out.println(person.age);//可以訪問內部類的私有成員System.out.println(person.heigth);//可以訪問內部類的公有成員
    } public void testtwo(){StaticTest st = new StaticTest();System.out.println(name);System.out.println(sex);//System.out.println(age);//不可以直接訪問內部類的成員//System.out.println(heigth);//不可以直接訪問內部類的成員
    }public static void main(String[] args) { //調用StaticTestStaticTest staticTest = new StaticTest();  staticTest.testone(); staticTest.testtwo();}  
}  
4、匿名內部類: 匿名內部類是在抽象類和接口的基礎之上發展起來的。匿名內部類如果繼承自接口,必須實現指定接口的方法,且無參數 。匿名內部類如果繼承自類,參數必須按父類的構造函數的參數傳遞
匿名內部類的特點:
1),一個類用于繼承其他類或是實現接口,并不需要增加額外的方法,只是對繼承方法的事先或是覆蓋。
2),只是為了獲得一個對象實例,不需要知道其實際類型。
3),類名沒有意義,也就是不需要使用到。
package three;abstract class parent {public abstract void like();
}public class Demo {public static void main(String[] args) {parent pt = new parent(){public void like(){System.out.println("吃飯睡覺打豆豆。。。");}};pt.like();}
}

?

匿名類與內部的聯系與區別:

?
按所在位置可以分為兩大類:
1、在類的方法中
特點:
a、可以訪問宿主類的所有元素 ;
b、保存宿主類對象的引用,創建對象時必須有宿主類對象;
c、 不能有靜態數據;
繼續劃分:
A、本地內部類;
B、匿名內部類
兩者的區別在于本地內部類有構造方法,而匿名內部類只能實例初始化;
2、在類或接口作用域中;
A、普通內部類
B、靜態內部類

?

內部類總結:

1.內部類作為外部類的一個特殊的成員來看待,因此它有類成員的封閉等級:private ,protected,默認(friendly),public 它有類成員的修飾符: ??static,final,abstract
2.非靜態內部類nested inner class,內部類隱含有一個外部類的指針this,因此,它可以訪問外部類的一切資源(當然包括private)外部類訪問內部類的成員,先要取得內部類的對象,并且取決于內部類成員的封裝等級。非靜態內部類不能包含任何static成員.
3.靜態內部類:static inner class,不再包含外部類的this指針,并且在外部類裝載時初始化. 靜態內部類只能訪問外部類static成員. 外部類訪問靜態內部類的成員:static成員:類名.成員;非static成員:對象.成員
4.對于方法中的內部類或塊中內部類只能訪問塊中或方法中的final變量。

轉載于:https://www.cnblogs.com/xiao-chuan/p/6014752.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394780.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394780.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394780.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蛋清打發奶油狀

在做蛋糕、冰淇凌、面包之類的時候往往都需要奶油狀蛋清,讓蛋糕、面包更蓬松,冰激凌也可以使用其當做奶油來用。用料 雞蛋4個 根據用量選擇鹽(只做冰激凌用奶油放)5g(根據蛋量)白醋(可以不放,根據喜好)5g(根據蛋量)白砂糖40g(分三次放)根據…

react構建_您應該了解的有關React的一切:開始構建所需的基礎知識

react構建by Scott Domes由斯科特多姆斯(Scott Domes) 您應該了解的有關React的一切:開始構建所需的基礎知識 (Everything You Should Know About React: The Basics You Need to Start Building) Are you curious about React and haven’t had the chance to lea…

榮新linux培訓,51CTO博客-專業IT技術博客創作平臺-技術成就夢想

切換用戶 su - root文件夾管理 mkdir(新建文件夾) rmdir(刪除空目錄)文件管理 touch(新建文件) rm(刪除文件)rm -rf(刪除文件夾) cat(查詢文件)文件文件夾 mv(剪切文件) cp(復制文件)默認拷貝文件,cp -r 就可以拷貝文件夾啦批量建文件 touch /root/tes…

Educational Codeforces Round 33 (Rated for Div. 2) E. Counting Arrays

題目鏈接 題意:給你兩個數x,yx,yx,y,讓你構造一些長為yyy的數列,讓這個數列的累乘為xxx,輸出方案數。 思路:考慮對xxx進行質因數分解,設某個質因子PiP_iPi?的的冪為kkk,則這個質因子的貢獻就相當于把kkk個PiP_iPi?放到yyy個盒子…

《面向對象分析與設計》一第2章 什么是面向對象分析

第2章 什么是面向對象分析 面向對象分析(ObjectOriented Analysis,OOA),就是運用面向對象方法進行系統分析。它是軟件生命周期的一個階段,具有一般分析方法所共同具有的內容、目標及策略。但是OOA強調運用面向對象方…

hql可以使用distinct嗎_輸送食品可以使用白色PVC輸送帶嗎?

食品,是給人們吃到肚子里的,因此不管在加工環節、制造環節還是其他環節,都需要做好食品的安全問題。根據不同的食品,其制造的環境也不同,所使用到的食品輸送帶的材質也是不一樣的,這些是需要根據輸送的食品…

htc one m7 linux驅動,HTC One M7官方RUU固件包(可救磚)

在網上找了找關于HTC One M7 (801e)的官方ruu固件包還不多,找了一些,不過有些不能下載,在這里整理了幾款可以下載的官方ruu包,這些包都是官方原版的,都是支持線刷的,大家可以下載下來備用了,也可…

emoji .png_根據我對3.5GB聊天記錄的分析,Emoji開發人員使用最多

emoji .pngby Evaristo Caraballo通過Evaristo Caraballo 根據我對3.5GB聊天記錄的分析,Emoji開發人員使用最多 (The Emoji developers use most — based on my analysis of 3.5GB of chat logs) Emoji have drastically changed the way we communicate in socia…

forward和redirect的區別

1.從地址欄顯示來說forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪里來的,所以它的地址欄還是原來的地址.redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求…

CF662C Binary Table(FWT)

[Luogu-CF662C] FWT_xor 題目描述 有一個 \(n\) 行 \(m\) 列的表格,每個元素都是 $0/1 $,每次操作可以選擇一行或一列,把 \(0/1\) 翻轉,即把 \(0\) 換為 \(1\) ,把 \(1\) 換為 \(0\) 。請問經過若干次操作后&#xff0…

c語言fmin最小公倍數,matlab小函數

8種機械鍵盤軸體對比本人程序員,要買一個寫代碼的鍵盤,請問紅軸和茶軸怎么選?(記得按字母序索引)矩陣向量化操作A(:)拉成一個向量 ($a_{11},a_{21},…$),注意先列后行repmat用途:創建由小型矩陣重復組合成的矩陣&#…

spring管理的類如何調用非spring管理的類

spring管理的類如何調用非spring管理的類. 就是使用一個spring提供的感知概念,在容器啟動的時候,注入上下文即可. 下面是一個工具類. 1 import org.springframework.beans.BeansException;2 import org.springframework.context.ApplicationContext;3 import org.springframewo…

django構建網頁_如何使用Django構建照片供稿

django構建網頁by Ogundipe Samuel由Ogundipe Samuel 如何使用Django構建照片供稿 (How to build a photo feed using Django) Today, we will make a real-time photo feed framework using Django and Pusher. This is like a mini Instagram, but without the comments and…

報表系統的雄心

這周有朋自遠方來,聊了對報表工具的看法,因此專門寫篇文章來談談報表系統的未來。 筆者知道不可能有十全十美的報表系統,畢竟任何一個行業和企業受自身客觀環境的限制,但表哥嘛,總要有點理想和追求,就好比到…

02----mockjs基本使用

一.mockjs基本使用 1.安裝mockjs cnpm install mockjs --save-dev2.新建mockjs文件夾/index.js // 引入 Mock var Mock require(mockjs)// 定義數據類型 var data Mock.mock({// 20條數據"data|20": [{// 商品種類"goodsClass": "女裝",// 商品…

vuefullcalendar怎么判斷切換上下月_房間太多、樓上樓下,終極解決家里wifi信號無縫切換問題...

相信不少人有我一樣的煩惱,房間太多,或者樓上樓下,家里的wifi信號總是不能無縫切換。路由器放在配電箱,除了客廳信號不錯外,一旦到了其他房間,掉線、網速慢等問題讓人很苦惱。特別是和小伙伴一起玩游戲一邊…

C語言程序順序結構1交換變量,如何將c語言中結構體內的所有類型變量的值輸出來...

教了多年《C程序設計》課程,大多學生覺的這門課程難學。其實,按照我們現在的教學大綱和教學要求,只要同學們掌握一些方法,克服心理上畏難、不輕言放棄,是完全可以學好的。《C 程序設計》的內容很豐富,按照我…

尼古拉斯 android_圣尼古拉斯和Alexa的訪問

尼古拉斯 android祝大家圣誕節快樂,并祝大家晚安! (Happy Christmas to all, and to all a good night!) Inspired by the holiday season, emerging voice-first technology, and too much eggnog — I’ve twisted the classic poem from Clement Clar…

github 進階說明

目錄 github 進階說明前言三個目錄樹重置 git reset增加路徑的reset檢出 checkout帶路徑的checkout倉庫數據對象其他資料github 進階說明 前言 我們可以什么都不管,照搬命令來完成我們大部分git工作,但是如果想要進一步,就要深入理解git的實現…

手把手教你 Spark 性能調優

0、背景 集群部分 spark 任務執行很慢,且經常出錯,參數改來改去怎么都無法優化其性能和解決頻繁隨機報錯的問題。 看了下任務的歷史運行情況,平均時間 3h 左右,而且極其不穩定,偶爾還會報錯: 1、優化思路 任…