Java内部类的定义和使用
為什么要用到內(nèi)部類:
在java開發(fā)學(xué)習(xí)中我們經(jīng)常會(huì)碰到內(nèi)部類。內(nèi)部類又有很多的優(yōu)勢:首先舉一個(gè)簡單的例子,如果你想實(shí)現(xiàn)一個(gè)接口,但是這個(gè)接口中的一個(gè)方法和你構(gòu)想的這個(gè)類中的一個(gè)方法名稱參數(shù)相同,你應(yīng)該怎么辦?這時(shí)候,你可以建一個(gè)內(nèi)部類實(shí)現(xiàn)這個(gè)接口。由于內(nèi)部類對外部類的所有內(nèi)容都是可訪問的,所以這樣做可以完成所有你直接實(shí)現(xiàn)這個(gè)接口的功能。不過你可能要質(zhì)疑,更改一下方法的不就行了嗎?的確,以此作為設(shè)計(jì)內(nèi)部類的理由,實(shí)在沒有說服力。真正的原因是這樣的,java中的內(nèi)部類和接口加在一起,從而java 通過內(nèi)部類加上接口,可以很好的實(shí)現(xiàn)多繼承的效果。
?
內(nèi)部類的分類和使用
1、成員內(nèi)部類: 即作為外部類的一個(gè)成員存在,與外部類的屬性、方法并列。注意:成員內(nèi)部類中不能定義靜態(tài)變量,但可以訪問外部類的所有成員。值得注意的是成員內(nèi)部類編譯成功后會(huì)生成的兩個(gè)不同的類(.class) 成員內(nèi)部類的優(yōu)點(diǎn): 1)、內(nèi)部類作為外部類的成員,可以訪問外部類的私有成員或?qū)傩浴?#xff08;即使將外部類聲明為PRIVATE,但是對于處于其內(nèi)部的內(nèi)部類還是可見的。) 2)、用內(nèi)部類定義在外部類中不可訪問的屬性。這樣就在外部類中實(shí)現(xiàn)了比外部類的private還要小的訪問權(quán)限。 package one;public class Outer{private static int outer_i = 1;private int k=20;public static void outer1(){//... }//成員內(nèi)部類class Inner{int j=100;//內(nèi)部類中外部類的實(shí)例變量可以共存int inner_i=1;void inner1(){System.out.println(outer_i);//外部類的變量如果和內(nèi)部類的變量沒有同名的,則可以直接用變量名訪問外部類的變量System.out.println(j);//在內(nèi)部類中訪問內(nèi)部類自己的變量直接用變量名System.out.println(this.j);//也可以在內(nèi)部類中用"this.變量名"來訪問內(nèi)部類變量//訪問外部類中與內(nèi)部類同名的實(shí)例變量可用"外部類名.this.變量名"。System.out.println(k);//外部類的變量如果和內(nèi)部類的變量沒有同名的,則可以直接用變量名訪問外部類的變量 outer1();}}//外部類的非靜態(tài)方法訪問成員內(nèi)部類public void outer2(){Inner inner = new Inner();inner.inner1();}//外部類的靜態(tài)方法訪問成員內(nèi)部類,與在外部類外部訪問成員內(nèi)部類一樣public static void outer3(){Outer out = new Outer();//step1 建立外部類對象Inner inner=out.new Inner();//step2 根據(jù)外部類對象建立內(nèi)部類對象inner.inner1();//step3 訪問內(nèi)部類的方法 }public static void main(String[] args){outer3();} }?
2、局部內(nèi)部類: 即在方法中定義的內(nèi)部類,與局部變量類似,在局部內(nèi)部類前不加修飾符public或private,其范圍為定義它的代碼塊。
?
public class Outer {public void say(){System.out.println("關(guān)門說真話!");} } public class Test {public void ting(){class MiMi extends Outer{//定義一個(gè)局部的內(nèi)部類,繼承Outer方法//…… }new MiMi().say();//調(diào)用局部內(nèi)部類中繼承的say方法 System.out.println("別人都不知道");}public static void main(String[] args) {new Test().ting();} }?
3、靜態(tài)內(nèi)部類: 靜態(tài)內(nèi)部類定義在類中,任何方法外,用static定義。注意:靜態(tài)內(nèi)部類中可以定義靜態(tài)或者非靜態(tài)的成員
package three;public class StaticTest { private static String name="abc";private String sex="男";static class Person{private String age = "18";//內(nèi)部私有成員public String heigth = "180";//內(nèi)部類公有成員public void display(){//System.out.println(sex);//報(bào)錯(cuò),不能直接訪問外部類的非靜態(tài)成員System.out.println(name);//只能直接訪問外部類的靜態(tài)成員System.out.println(age);//訪問本內(nèi)部類成員。 } }public void testone(){Person person = new Person();person.display();//System.out.println(heigth);//報(bào)錯(cuò),是因?yàn)椴豢梢灾苯釉L問內(nèi)部類私有成員//System.out.println(age);//報(bào)錯(cuò),是因?yàn)椴豢梢灾苯釉L問內(nèi)部類公有成員System.out.println(person.age);//可以訪問內(nèi)部類的私有成員System.out.println(person.heigth);//可以訪問內(nèi)部類的公有成員 } public void testtwo(){StaticTest st = new StaticTest();System.out.println(name);System.out.println(sex);//System.out.println(age);//不可以直接訪問內(nèi)部類的成員//System.out.println(heigth);//不可以直接訪問內(nèi)部類的成員 }public static void main(String[] args) { //調(diào)用StaticTestStaticTest staticTest = new StaticTest(); staticTest.testone(); staticTest.testtwo();} } 4、匿名內(nèi)部類: 匿名內(nèi)部類是在抽象類和接口的基礎(chǔ)之上發(fā)展起來的。匿名內(nèi)部類如果繼承自接口,必須實(shí)現(xiàn)指定接口的方法,且無參數(shù) 。匿名內(nèi)部類如果繼承自類,參數(shù)必須按父類的構(gòu)造函數(shù)的參數(shù)傳遞 匿名內(nèi)部類的特點(diǎn): 1),一個(gè)類用于繼承其他類或是實(shí)現(xiàn)接口,并不需要增加額外的方法,只是對繼承方法的事先或是覆蓋。 2),只是為了獲得一個(gè)對象實(shí)例,不需要知道其實(shí)際類型。 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();} }?
匿名類與內(nèi)部的聯(lián)系與區(qū)別:
? 按所在位置可以分為兩大類: 1、在類的方法中 特點(diǎn): a、可以訪問宿主類的所有元素 ; b、保存宿主類對象的引用,創(chuàng)建對象時(shí)必須有宿主類對象; c、 不能有靜態(tài)數(shù)據(jù); 繼續(xù)劃分: A、本地內(nèi)部類; B、匿名內(nèi)部類 兩者的區(qū)別在于本地內(nèi)部類有構(gòu)造方法,而匿名內(nèi)部類只能實(shí)例初始化; 2、在類或接口作用域中; A、普通內(nèi)部類 B、靜態(tài)內(nèi)部類?
內(nèi)部類總結(jié):
1.內(nèi)部類作為外部類的一個(gè)特殊的成員來看待,因此它有類成員的封閉等級(jí):private ,protected,默認(rèn)(friendly),public 它有類成員的修飾符: ??static,final,abstract 2.非靜態(tài)內(nèi)部類nested inner class,內(nèi)部類隱含有一個(gè)外部類的指針this,因此,它可以訪問外部類的一切資源(當(dāng)然包括private)外部類訪問內(nèi)部類的成員,先要取得內(nèi)部類的對象,并且取決于內(nèi)部類成員的封裝等級(jí)。非靜態(tài)內(nèi)部類不能包含任何static成員. 3.靜態(tài)內(nèi)部類:static inner class,不再包含外部類的this指針,并且在外部類裝載時(shí)初始化. 靜態(tài)內(nèi)部類只能訪問外部類static成員. 外部類訪問靜態(tài)內(nèi)部類的成員:static成員:類名.成員;非static成員:對象.成員 4.對于方法中的內(nèi)部類或塊中內(nèi)部類只能訪問塊中或方法中的final變量。轉(zhuǎn)載于:https://www.cnblogs.com/xiao-chuan/p/6014752.html
總結(jié)
以上是生活随笔為你收集整理的Java内部类的定义和使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【洛谷P1966】火柴排队
- 下一篇: Java 多线程 笔记 转自htt