部門(mén)網(wǎng)站建設(shè)個(gè)人總結(jié)網(wǎng)站客服
內(nèi)部類(lèi)
-
內(nèi)部類(lèi)就是在一個(gè)類(lèi)中定義一個(gè)類(lèi),(在A類(lèi)中定義一個(gè)B類(lèi),B類(lèi)就被稱(chēng)為內(nèi)部類(lèi))
格式:public class 類(lèi)名{ 修飾符 class 類(lèi)名{} } 如:public class Outer{ public class Inner {} }
//內(nèi)部類(lèi)可以訪(fǎng)問(wèn)外部類(lèi)的成員,包括私有。 //外部類(lèi)要訪(fǎng)問(wèn)內(nèi)部類(lèi)的成員,必須創(chuàng)建對(duì)象。
public class Outer{private int num = 10;public class Inner{public void show(){System.out.pirntln(num);//內(nèi)部類(lèi)可以直接訪(fǎng)問(wèn)外部類(lèi)的成員,包括私有}}public void method(){Inner i = new Inner();//外部類(lèi)想要訪(fǎng)問(wèn)內(nèi)部類(lèi)需要?jiǎng)?chuàng)建對(duì)象i.show();} }
-
按照內(nèi)部類(lèi)在類(lèi)中定義的位置不同,可以分為兩種:在類(lèi)的成員位置被稱(chēng)為成員內(nèi)部類(lèi);在類(lèi)的局部位置(方法位置)被稱(chēng)為局部?jī)?nèi)部類(lèi)。
//成員內(nèi)部類(lèi)創(chuàng)建對(duì)象格式:外部類(lèi)名 . 內(nèi)部類(lèi)名 對(duì)象名 = 外部類(lèi)對(duì)象 . 內(nèi)部類(lèi)對(duì)象;(Outer.Inner oi = new Outer().new Inner();)
public class Outer{private int num = 10;private class Inner{public void show(){System.out.println(num);}}public void method(){Inner i = new Inner();//在method的方法中創(chuàng)建Inner內(nèi)部類(lèi)的對(duì)象并調(diào)用方法i.show();} } ? //測(cè)試類(lèi) public class InnerDemo{public static void main(String[] args){Outer o = new Outer();//在測(cè)試方法中創(chuàng)建外部類(lèi)對(duì)象o.method(); ? ? ? ? //外部類(lèi)對(duì)象調(diào)用method方法間接調(diào)用內(nèi)部類(lèi)對(duì)象和方法} }
//局部?jī)?nèi)部類(lèi)是在方法中定義的類(lèi),所以外界無(wú)法直接使用,需要在方法內(nèi)部創(chuàng)建對(duì)象并使用該類(lèi)可以直接訪(fǎng)問(wèn)外部類(lèi)成員,也可以訪(fǎng)問(wèn)方法內(nèi)的局部變量。
public class Outer {private int num = 10;public void method(){int num2 = 20;//在方法中定義一個(gè)成員變量class Inner{public void show(){System.out.println(num);System.out.println(num2);}}Inner i = new Inner();//在方法中定義對(duì)象并調(diào)用i.show();} } ? //測(cè)試類(lèi) public class OuterDemo{public static void main(String[] args){Outer o = new Outer();//定義外部類(lèi)對(duì)象o.method();//外部類(lèi)對(duì)象調(diào)用方法,間間訪(fǎng)問(wèn)到局部?jī)?nèi)部類(lèi)的對(duì)象i調(diào)用的show方法} }
-
匿名內(nèi)部類(lèi)(局部?jī)?nèi)部類(lèi)的一種)
匿名內(nèi)部類(lèi)本質(zhì)是一個(gè)繼承了該類(lèi)或者實(shí)現(xiàn)了該類(lèi)接口的子類(lèi)匿名對(duì)象。
格式:new 類(lèi)名或者接口名(){ 重寫(xiě)方法; }; 如:new Inter(){ public void show(){} }; //最后分號(hào)不要缺少
//定義一個(gè)接口 public interface Inter {void show(); } ? //在外部類(lèi)中寫(xiě)局部?jī)?nèi)部類(lèi),然后寫(xiě)匿名內(nèi)部類(lèi) public class Outer{public void method(){new Inter(){@Overridepublic void show(){System.out.println("匿名內(nèi)部類(lèi)");}};//現(xiàn)在本質(zhì)是一個(gè)對(duì)象new Inter(){@Overridepublic void show(){System.out.println("匿名內(nèi)部類(lèi)");}}.show();//匿名內(nèi)部類(lèi)對(duì)象調(diào)用show方法,可以多次調(diào)用//因?yàn)槎x的是個(gè)接口的實(shí)現(xiàn)類(lèi)對(duì)象Inter i = new Inter(){@Overridepublic void show(){System.out.println("匿名內(nèi)部類(lèi)");}};i.show();} } ? //定義一個(gè)測(cè)試類(lèi) public class OuterDemo{public static void main(String[] args){Outer o = new Outer();o.method();} }
//創(chuàng)建跳高接口 public interface Jumpping{void jump(); } ? //接口的操作類(lèi),里面有一個(gè)方法方法的參數(shù)是接口名 public class JumppingOperator{public void method(Jumpping j){j.jump();} } ? //測(cè)試類(lèi) public class JumppingDemo{public static void main(String[] args){//需求:創(chuàng)建接口操作類(lèi)的對(duì)象,調(diào)用method方法JumppingOperator jo = new Jumpping Operator();Jumpping j = new Cat();//需要先創(chuàng)建實(shí)現(xiàn)類(lèi),然后在測(cè)試類(lèi)中創(chuàng)建實(shí)現(xiàn)類(lèi)對(duì)象jo.method(j);//調(diào)的是接口名,因?yàn)榻涌诓荒苤苯右?#xff0c;因此需要定義一個(gè)實(shí)現(xiàn)類(lèi)對(duì)象//如果不想創(chuàng)建實(shí)現(xiàn)類(lèi)再定義對(duì)象,可以使用匿名內(nèi)部類(lèi)(本質(zhì)是一個(gè)對(duì)象)jo.method(new Jumpping(){@Overridepublic void jump(){System.out.println("貓可以跳高了"); ? }});} }