【內部類】 成員內部類、局部內部類、匿名內部類

  • 成員內部類

public  class  外部類{
    //成員內部類
    public  class  內部類{
        public  void  fun(){
           System.out.println(num);   //內部類可以訪問外部類的成員
        }
    }

    private  int  num = 0;  
    //外部類如果要訪問內部類的成員,則需要通過內部類的對象訪問
}

使用方式:

1.外部類使用內部類,主函數再使用外部類

2.通過new的方式

外部類.內部類 對象名 = new 外部類().new 內部類();

 

  • 局部內部類

定義在方法內部的類,就是局部內部類,只有當前所屬方法才能使用。

//外部類
public class Outer{
	public void methodOuter(){
		//局部內部類
		class Inner{
			final int n = 0;  // 2.則這個局部變量必須是final修飾的
			public void methodInner(){
				System.out.println(n);  // 1.局部內部類要訪問所在方法中的局部變量
			}
		}
		
		Inner inner = new Inner();
		inner.methodInner();
	}
}
public class MyMain{
	public static void main(String[] args){
		Outer outer = new Outer();
		outer.methodOuter();
	}
}

 

局部內部類要訪問所在方法中的局部變量,則這個局部變量必須是final修飾的。

原因:

1.new出來的對象在堆中

2.局部變量跟着方法走的,在棧內存當中

3.方法運行結束後,立刻出棧,局部變量就會消失

4.但是new出來的對象還在堆中,直到被回收

 

定義一個類的時候,修飾權限符的規則:

1.外部類:public、(default)

2.成員內部類:public、protected、(default)、private

3.局部內部類:無

 

  • 匿名內部類(實現接口不用實現類)

如果接口的實現類(或者是父類的子類)只需要使用唯一一次,那麼這種情況下,就可以省略該類的定義,而改爲使用匿名內部類。

public interface MyInterFace{
	public abstract void show();
}
public class Cat implements MyInterFace{
	public void show(){
		System.out.println("Hello");
	}
}
public class MyMain{
	public static void main(String[] args){
		//一般情況
		Cat cat = new Cat();
		//或者 MyInterFace cat = new Cat();
	}
}

匿名內部類實現

public interface MyInterFace{
	public abstract void show();
}
public class MyMain{
	public static void main(String[] args){
        //沒有實現類Cat
		MyInterFace cat = new MyInterFace(){
            //覆蓋所有抽象方法
             public void show(){
		        System.out.println("Hello");
	         }
        };  //別忘了分號
	}
}

或者不用對象名

public class MyMain{
	public static void main(String[] args){
		new MyInterFace(){
             public void show(){
		        System.out.println("Hello");
	         }
        }.show();   //一次性的方法調用
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章