Java內部類全介紹

內部類

  1. 靜態內部類
  2. 成員內部類
  3. 局部內部類
  4. 匿名內部類(屬於局部內部類的一種)

1. 靜態內部類

  • 靜態內部類可以等同看作靜態變量

  • 內部類的重要作用:

    • 可以訪問外部類中的私有數據
  • 靜態內部類可以直接訪問外部類的靜態數據(靜態變量,靜態方法),無法直接訪問成員(實例變量,實例方法)

    class OuterClass {
    	// 靜態變量
    	private static String s1="A";
    	//實例變量
    	private String s2 = "B";
    	//靜態方法
    	private static void m1() {
    		System.out.println("static's m1() method executed");
    	}
    	//實例方法
    	private void m2() {
    		System.out.println("m2() method executed");
    	}
    	
    	// 定義靜態內部類,可以使用 public, private, protected, default修飾
    	static class InnerClass{
    		// 靜態方法
    		public static void m3() {
    			
    			System.out.println("static's m3() method executed");
    			System.out.println(s1);
    			m1();
    //			System.out.println(s2);
    //			m2();
    		}
    		// 成員方法
    		public void m4() {
    			System.out.println("m4() method executed");
    			System.out.println(s1);
    			m1();
    //			System.out.println(s2);
    //			m2();
    		}
    	}
        public static void main(String[] args) {
    		//執行m3
    		OuterClass.InnerClass.m3();
    		
    		// 執行m4
    		OuterClass.InnerClass inner = new OuterClass.InnerClass();
    		inner.m4();
    	}
    	
    }
    
    

2. 成員內部類

  • 成員內部類可以等同看作成員方法

  • 成員內部類中不能有靜態聲明

    • 包括靜態變量和靜態方法
  • 成員內部類可以訪問外部類的所有數據

    public class MemberInnerClass {
    	// 靜態變量
    	private static String s1="A";
    	//實例變量
    	private String s2 = "B";
    	//靜態方法
    	private static void m1() {
    		System.out.println("static's m1() method executed");
    	}
    	//實例方法
    	private void m2() {
    		System.out.println("m2() method executed");
    	}
    	
    	// 定義靜態內部類,可以使用 public, private, protected, default修飾
    	class InnerClass{
    		// 靜態方法// 成員內部類中不能有靜態方法
    //		public static void m3() {
    //			
    //			System.out.println("static's m3() method executed");
    //			System.out.println(s1);
    //			m1();
    ////				System.out.println(s2);
    ////				m2();
    //		}
    		// 成員方法// 成員內部類可以訪問外部類的所有數據
    		public void m4() {
    			System.out.println("m4() method executed");
    			System.out.println(s1);
    			m1();
    			System.out.println(s2);
    			m2();
    		}
    	}
    	public static void main(String[] args) {
    		// 創建外部對象
    		MemberInnerClass mic = new MemberInnerClass();
    		InnerClass inner = mic.new InnerClass();
    		inner.m4();
    	}
    
    }
    

3. 局部內部類

  • 局部內部類等同於局部變量

  • 局部內部類不能用訪問權限控制修飾符修飾

    • 局部變量也沒有見過用public等修飾符修飾的(=_=)
  • 局部內部類中不能有靜態聲明(包括靜態變量和靜態方法)

  • 局部內部類中訪問內部類外的局部變量必須是final

    -也可以不是final的,只要後續不在局部內部類改變這個變量的值就可以啦

  • 局部內部類相當於局部變量,出了大括號{}之後就沒人認識了

    • 要使用局部內部類中的方法,必須在局部內部類外,創建局部對象
    public class TempInnerClass {
    	public void m1() {
    		final int i = 10;
    		// 聲明局部內部類時候,class前面不能加訪問控制修飾符
    		class InnerClass{
    //			public static void m1() {// 局部內部類中不能有靜態聲明
    //			};
    			public void m1() {
    				//Local variable i defined in an enclosing scope must be final or effectively final
    				System.out.println(i);// 局部內部類調用內部類外的變量時候,變量必須是final的或者是有效的final的
    			}
    		}
    //		i = 100;
    		// 調用局部內部類中的方法
    		InnerClass inner = new InnerClass();
    		inner.m1();
    	}
    	public static void main(String[] args) {
    		new TempInnerClass().m1();
    	}
    }
    

4. 匿名內部類

指的是:類沒有名字
一般用於接口的實現

  • 優點:少定義一個類

  • 缺點:無法重複使用

    
    public class NamelessInnerClass {
    	
    	public static void t(CustomeService cs) {
    		cs.logout();
    	}
    	
    	public static void main(String[] args) {
    		//如何調用t方法??
    //		1. 新建一個類,實現CustomeService接口
    		t(new CustomeServiceImp());
    //		2. 使用匿名內部類
    			// new CustomeService() {} 這些全都屬於匿名內部類
    		t(new CustomeService() {
    
    			@Override
    			public void logout() {
    				System.out.println("匿名內部類:成功退出程序");
    			}
    			
    		});
    	}
    }
    
    interface CustomeService{
    	void logout();
    }
    
    class CustomeServiceImp implements CustomeService{
    
    	@Override
    	public void logout() {
    		System.out.println("成功退出程序");
    	}
    	
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章