文章摘要
1、內部類按照類別可以分為:非靜態成員內部類、局部內部類、靜態成員內部類、匿名內部類。
2、非靜態內部類相當于外部類的非靜態成員屬性以及方法,含有外部對象的引用。
3、非靜態內部類不允許定義靜態成員變量,但是可以存在靜態常量。
一、內部類綜述
1、內部類按照類別可以分為:非靜態成員內部類、局部內部類、靜態成員內部類、匿名內部類。
2、內部類編譯結束后的class文件,以“外部類$內部類內部類.class”的形式出現。
內部類
3、內部類對象會保留一個外部對象的引用,即:Out.this。
二、非靜態成員內部類。
1、非靜態成員內部類:不帶有關鍵字static,相當于外部類的內部屬性以及方法的集合。
代碼形式:
public class 外部類{
class 內部類{//非靜態內部類
}
}
2、實例化方式:
public class 外部類 {
class 內部類{
public void display(){
System.out.println("這是內部類。。");
}
}
public static void main(String args[]){
//1、非靜態成員內部類的實例化方式
外部類 Outer = new 外部類();
內部類 Inner = Outer.new 內部類();//等同于:new 外部類().new 內部類();
Inner.display();
}
}
3、常見用法及其注意事項:
非靜態內部類相當于外部類的非靜態成員屬性以及方法,含有外部對象的引用。
訪問自己內部的成員屬性。可以直接訪問,也可以通過【內部類.this】或者【this】來代表內部類。
【外部類.this】可以代表外部類對象的引用。
public class 外部類 {
private String name="外部類";//外部類name聲明并實例化
class 內部類{
private String name="內部類";//內部類name聲明并實例化
public void display(){
//直接訪問內部類內部成員變量
System.out.println("內部類描述1:"+name);
//內部類.this或者this.name代表內部類自身
System.out.println("內部類描述2:"+內部類.this.name);
//外部類.this代表外部類的引用
System.out.println("外部類描述:"+外部類.this.name);
}
}
public static void main(String args[]){
//1、非靜態成員內部類的實例化方式
外部類 Outer = new 外部類();
內部類 Inner = Outer.new 內部類();
Inner.display();
}
}
輸出:
內部類描述1:內部類
內部類描述2:內部類
外部類描述:外部類
c、外部類方法引用內部類對象以及方法
public class 外部類 {
private String name="外部類";//外部類name聲明并實例化
public void display(){
System.out.println("外部類描述:"+name);
//
內部類 inner = new 內部類();
inner.display();
System.out.println("內部類成員屬性:"+inner.name);
}
class 內部類{
private String name="內部類";//內部類name聲明并實例化
public void display(){
//直接訪問內部類內部成員變量
System.out.println("內部類描述1:"+name);
//內部類.this或者this.name代表內部類自身
System.out.println("內部類描述2:"+內部類.this.name);
//外部類.this代表外部類的引用
System.out.println("外部類描述:"+外部類.this.name);
}
}
}
三、局部內部類
1、代碼形式:
public class 外部類 {
public void demoPartialClass(){
class 局部內部類{
}
}
}
2、局部內部類的實例化:
public class 外部類 {
public void demoPartialClass(final String name){
class 局部內部類{
}
//1、局部內部類的實例化
局部內部類 partialInnerClass = new 局部內部類();
}
}
3、常見用法及注意事項
局部內部類中訪問外部局部變量,變量必須是final的。
public void demoPartialClass(final String name){//必須是final修飾的
final String discription = "這里演示局部內部類";
class 局部內部類{
public void display(){
System.out.println("局部內部類描述:"+name);
}
public void work(){
System.out.println("局部內部類工作:"+discription);
}
}
}
四、靜態內部類
靜態內部類相當于外部定義的類,類名前可以使用public、protected以及private等修飾。
1、代碼形式:
public class 外部類 {
/*public*/ static class 靜態內部類{
}
}
2、靜態內部類的實例化
public class 外部類 {
/*public*/ static class 靜態內部類{
}
}
靜態內部類 static_ = new 靜態內部類();
3、常見用法及注意事項
可以訪問局部內部類中的非靜態方法和屬性,不能訪問外部類的非靜態成員方法和屬性。
public class 外部類 {
/*public*/ static class 靜態內部類{
private static String name="靜態內部類";
public void display() {
System.out.println("靜態內部類描述:" + name);
//2、無法調用外部類的非靜態屬性、方法
// System.out.println("外部類的非靜態屬性:"+外部類.this.name);//報錯
// System.out.println("外部類的非靜態方法:"+外部類.this.display());//報錯
}
}
}
五、匿名內部類
1、代碼形式:
new 接口/類{
//add unimplemented methods
};
ps:不要忘記大括號最好的分號。
二、實例化:
匿名內部類只能實例化一個對象
public class 外部類 {
public void demoAnnonymos() {
new Object(){
public String toString() {
return super.toString();
}
};
}
}