本章目標
- 掌握內部類的優(yōu)缺點
- 掌握內部類的使用格式
- 掌握static聲明內部類的作用
- 可以使用內部類訪問方法中的參數
1旭寿、具體內容
1.1暴浦、什么叫內部類
在一個類的內部還存在另外一個類溅话,則稱為內部類。
class Outer{ // 定義外部類
private String info = "hello world" ; // 定義外部類的私有屬性
class Inner{ // 定義內部類
public void print(){ // 定義內部類的方法
System.out.println(info) ; // 直接訪問外部類的私有屬性
}
};
public void fun(){ // 定義外部類的方法
new Inner().print() ; // 通過內部類的實例化對象調用方法
}
};
public class InnerClassDemo01{
public static void main(String args[]){
new Outer().fun() ; // 調用外部類的fun()方法
}
};
輸出結果:
hello world
以上程序中歌焦,Inner類作為Outer類的內部類存在飞几,并且在外部類的fun()方法之中直接實例化內部類的對象并調用print()方法。
內部類存在的特點:
- 缺點:正常的一個類操作時独撇,在類中最好只定義屬性或方法屑墨,如果定義一個類的話。則肯定破壞了程序的結構
- 有點:想要發(fā)現其優(yōu)點纷铣,則必須通過代碼拆分來觀察卵史,將以上的內部類和外部類變?yōu)閮蓚€類的形式,再完成同樣的效果搜立。
class Outer{ // 定義外部類
private String info = "hello world" ; // 定義外部類的私有屬性
public void fun(){ // 定義外部類的方法
new Inner(this).print() ; // 通過內部類的實例化對象調用方法
}
public String getInfo(){ // 增加了一個getter方法取得info內容
return this.info ;
}
};
class Inner{ // 定義內部類
private Outer out = null ; // 聲明Outer對象
public Inner(Outer out){
this.out = out ;
}
public void print(){ // 定義內部類的方法
System.out.println(this.out.getInfo()) ; // 直接訪問外部類的私有屬性
}
};
public class InnerClassDemo02{
public static void main(String args[]){
new Outer().fun() ; // 調用外部類的fun()方法
}
};
如果將內部類拿到外部之后以躯,會發(fā)現代碼增加了,而且復雜度也增加了啄踊。使用內部類的最大優(yōu)點:可以方便訪問外部類中的私有屬性忧设。
但是,以上的內部類颠通,是無法在外部直接調用的址晕,是無法按照外部類的形式使用的。
1.2蒜哀、使用static聲明內部類
如果一個內部類使用static關鍵字聲明斩箫,則此內部類就稱為外部類吏砂,可以直接通過外部類.內部了進行訪問。
class Outer{ // 定義外部類
private static String info = "hello world" ; // 定義外部類的私有屬性
static class Inner{ // 使用static定義內部類為外部類
public void print(){ // 定義內部類的方法
System.o ut.println(info) ; // 直接訪問外部類的私有屬性
}
};
public void fun(){ // 定義外部類的方法
new Inner().print() ; // 通過內部類的實例化對象調用方法
}
};
public class InnerClassDemo03{
public static void main(String args[]){
new Outer.Inner().print() ; // 調用外部類的fun()方法
}
};
輸出結果:
hello world
使用static可以聲明一個內部類乘客,聲明的內部類就稱為外部類狐血,可以在類的外部調用,但是如果要想訪問外部類中的屬性易核,則此屬性必須是static訪問權限的匈织。
1.3、在外部訪問內部類
一個內部類可以通過外部類直接訪問牡直,也可以直接在其他類中調用缀匕,但是調用的格式:
- 外部類.內部類 內部類對象 = 外部類實例.new 內部類();
class Outer{ // 定義外部類
private String info = "hello world" ; // 定義外部類的私有屬性
class Inner{ // 定義內部類
public void print(){ // 定義內部類的方法
System.out.println(info) ; // 直接訪問外部類的私有屬性
}
};
public void fun(){ // 定義外部類的方法
new Inner().print() ; // 通過內部類的實例化對象調用方法
}
};
public class InnerClassDemo04{
public static void main(String args[]){
Outer out = new Outer() ; // 外部類實例化對象
Outer.Inner in = out.new Inner() ; // 實例化內部類對象
in.print() ; // 調用內部類的方法
}
};
輸出結果:
hello world
1.4、在方法中定義內部類
一個內部類可以在任意的位置上定義碰逸,下面看一下在方法中定義內部類乡小。
class Outer{ // 定義外部類
private String info = "hello world" ; // 定義外部類的私有屬性
public void fun(final int temp){ // 定義外部類的方法
class Inner{ // 在方法中定義的內部類
public void print(){ // 定義內部類的方法
System.out.println("類中的屬性:" + info) ; // 直接訪問外部類的私有屬性
System.out.println("方法中的參數:" + temp) ;
}
};
new Inner().print() ; // 通過內部類的實例化對象調用方法
}
};
public class InnerClassDemo05{
public static void main(String args[]){
new Outer().fun(30) ; // 調用外部類的方法
}
};
輸出結果:
類中的屬性:hello world
方法中的參數:30
2、總結
內部類在實際的開發(fā)中非常有用處饵史,所以一定要熟悉其語法及其優(yōu)點满钟。
在Java系統(tǒng)中也會到處看到使用static聲明內部類的情況,一定要記住胳喷,使用static聲明的內部類湃番,是外部類,操作的時候要是用“外部類.內部類”的形式訪問吭露。