Java 之 内部类
(static修飾的成員屬于整個(gè)類,而不屬于單個(gè)對(duì)象)
定義:將一個(gè)類放到另一個(gè)類的內(nèi)部定義,這個(gè)在內(nèi)部定義的類就叫做內(nèi)部類(也有的成嵌套類),包含內(nèi)部類的類被稱為外部類(也有的稱宿主類)。
1。非靜態(tài)內(nèi)部類
沒(méi)有使用static修飾的內(nèi)部類就是非靜態(tài)內(nèi)部類。
注意:a。java不允許在非靜態(tài)內(nèi)部類中定義靜態(tài)成員
b。當(dāng)調(diào)用非靜態(tài)內(nèi)部類中的實(shí)例方法時(shí),必須有一個(gè)非靜態(tài)成員內(nèi)部類實(shí)例,非靜態(tài)內(nèi)部類實(shí)例必須寄生在外部實(shí)例內(nèi)
c。如果外部類成員變量與內(nèi)部類成員變量與內(nèi)部類里的方法的局部變量同名,可通過(guò)this,外部類類名.this 作為限定來(lái)加以區(qū)分。
public class Test {private String prop = "外部類的實(shí)例變量";public class InClass{private String prop = "內(nèi)部類中的實(shí)例變量";public void info(){String prop = "局部變量";System.out.println("外部類的實(shí)例變量值:"+Test.this.prop);System.out.println("內(nèi)部類的實(shí)例變量值:" + this.prop);System.out.println("局部變量:" + prop);}}public void test(){InClass ic = new InClass();ic.info();}public static void main(String[] args){/** Test ts = new Test();* ts.test();* 上下的代碼作用一樣*/new Test().test();} }使用非靜態(tài)內(nèi)部類:
在外部類以外的地方定義內(nèi)部類的語(yǔ)法格式: OuterClass.InnerClass? VarName
在外部類以外的地方創(chuàng)建非靜態(tài)內(nèi)部類實(shí)例的語(yǔ)法: OuterInstace .new? InnerConstructor()
class Out{class In{public In(String msg){System.out.println(msg);}} } public class CreateInnerInstance {public static void main(String[] args){//OuterClass.InnerClass varName = new OutInstance.new InnearConstructor();Out.In in = new Out().new In("測(cè)試信息");/*Out.In in;*Out out = new Out();*in2 = out.new In("測(cè)試信息");*/
} }
?
2.靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類是用static修飾的內(nèi)部類,也稱類內(nèi)部類。
a。靜態(tài)內(nèi)部類不能訪問(wèn)外部類的實(shí)例成員,只能訪問(wèn)外部類的類成員(同為static 修飾)。
c。外部類依然不能訪問(wèn)靜態(tài)內(nèi)部類中的成員,但可以使用靜態(tài)內(nèi)部類的類名作為調(diào)用者來(lái)訪問(wèn)靜態(tài)內(nèi)部類中的類成員,也可以使用靜態(tài)內(nèi)部類對(duì)象作為調(diào)用者來(lái)訪問(wèn)靜態(tài)內(nèi)部類中的實(shí)例變量。
public class StaticInnerClassTest {private int prop = 5 ;private static int prop1 = 6 ;static class InClass{public void accessOuterProp(){private static int prop = 5;
private int prop1 = 6;
//System.out.println(prop); //這句代碼會(huì)出錯(cuò),靜態(tài)內(nèi)部類無(wú)法訪問(wèn)外部類的非靜態(tài)成員
System.out.println(prop1);}}
public void accessInnerPro(){
//通過(guò)靜態(tài)內(nèi)部類的類名訪問(wèn)靜態(tài)內(nèi)部類中的類成員
System.out.println(InClass.prop);
//通過(guò)靜態(tài)內(nèi)部類對(duì)象作為調(diào)用者來(lái)訪問(wèn)靜態(tài)內(nèi)部類中的實(shí)例變量
SYstem.out.println(new InClass().prop1);
}
}
在外部類以外使用使用靜態(tài)內(nèi)部類:(和使用非靜態(tài)比較,相類似)
語(yǔ)法:?? new OuterClass.InnerConstructor()
3.匿名內(nèi)部類
如果把一個(gè)內(nèi)部類放到方法中定義,則這個(gè)內(nèi)部類就是一個(gè)局部?jī)?nèi)部類,局部?jī)?nèi)部類僅在該方法里有效。
定義匿名內(nèi)部類的格式:
new 實(shí)現(xiàn)接口 | 父類構(gòu)造器(實(shí)參列表) {類體部分 }可以看出,匿名內(nèi)部類必須繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口。
interface Product{public Double getPrice();public String getName(); } public class AnonymTest {public void ce(Product p){System.out.println("購(gòu)買了一個(gè)" + p.getName() + ",花掉了" + p.getPrice());}public static void main(String[] args){AnonymTest at = new AnonymTest();at.ce(new Product() {@Overridepublic Double getPrice() {return 0.5;}@Overridepublic String getName() {return "辣條";}});} }?
轉(zhuǎn)載于:https://www.cnblogs.com/mercuryli/p/4603311.html
總結(jié)
以上是生活随笔為你收集整理的Java 之 内部类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iOS定时器
- 下一篇: Oracle 直方图理论