JavaEE學習筆記-(3)內部類

內部類

  1. 什麼是內部類: 定義在一個類的類體當中的類

  2. 作用: 共享數據的方式之一

  3. 分類

  • 成員內部類

    ​ 可以共享外部類所有的 屬性和方法(病毒和人的關係)

    ​ 創建方式: Outer.Inner in = new Outer.new Inner();

    ​ 內部類中不允許有static修飾的內容,除非內部類有static修飾

  public class OuterInner{
     	public static void main(String[] args){
  		Outer.Inner inner =new Outer().new Inner();
     		inner.show();
     
     	}
     }
     
     class Outer{
     	int i=1;
     	static int j=2;
     
     	class Inner{
     		public void show(){
     			System.out.println(i);
     			System.out.println(j);
     		}
     	}
     }
     /*
     這樣的寫法是不可以的 Inner中的show()方法是無法訪問到i的
     class Outer{
     	int i=1;
     }
     calss Inner{
     	public void show(){
     	System.out.println(i);
     	}
     }
     */
  • 靜態內部類

    ​ 爲了描述類和類的關係

    ​ 只能共享外部類的 靜態的屬性和方法(房東和租客的關係)

    ​ 創建方式:Outer.Inner in = new Outer.Inner();

    public class OuterInner{
    	public static void main(String[] args){
     		Outer.Inner inner =new Outer.Inner();
     		inner.show();
    
    	}
    }
    
    class Outer{
    	int x=1;
    	static int y=2;
    
    	static class Inner{
    		int z=5;
    		static int i=6;
    
    		public void show(){
    			//System.out.println(x); 無法訪問的x
    			System.out.println(y);
    			System.out.println(z);
    			System.out.println(i);
    		}
    	}
    }
    

  • 局部內部類

    ​ 在外部類的方法體中,永遠都不可以有static的聲明

    ​ 1)如果能夠共享外部類的所有成員: 存在於非靜態方法中

    ​ 2) 如果能夠共享外部類的靜態成員: 存在於靜態方法中

    ​ final修飾的局部變量 jdk8.0以後可以不加final(老師和學生的關係)

    ​ 創建方式:Inner in = new Inner(); 內部類結束之後 所在的方法結束之前

    public class OuterInner{
    	public static void main(String[] args){
    	Outer outer =new Outer();
    
    	outer.show(999);
    
    	}
    }
    
    class Outer{
    	int a=1; //成員變量
    	static int b=2;  //靜態變量
    
    	public void show(int c){
    		int d=8;  //局部變量
    
    		class Inner{  //局部內部類
    			int x=9;
    
    			public void test(){
    				System.out.println(a);
    				System.out.println(b);
    				// c d 是final最終變量  無法修改
    				System.out.println(c);
    				System.out.println(d);
    
    				System.out.println(x);
    			}
    		}// 類結束之後
    
    		Inner inner = new Inner();
    		inner.test();
    		//方法結束之前
    	}
    
    }
    
  • 匿名內部類

    ​ 某些情況下,一個類的名字並不重要,使用一之後就不再使用

    這個名字就顯得很無用

    ​ 創建方式:

    ​ new 父類/接口(){

    ​ };

    ​ 匿名類可以共享的數據 取決於匿名內部類的位置 可能等價於上面三種形式

    import java.util.*;
    public class OuterInner{
    	public static void main(String[] args){// 實現了Comparator接口的 無名的 類對象
    		Set<Integer> set =new TreeSet<>(new Comparator<Integer>(){
    			@Override
    			public int compare(Integer x ,Integer y){
    				return y-x;  //降序
    			}
    		});
    		
    		//Set<Integer> set =new TreeSet<>((x,y) -> y-x); jdk8.0lambda表達		  //式 在部分場景下可以代替匿名內部類
    
    
    		Collections.addAll(set,5,3,4,1,2);
    		System.out.println(set);
    
    	}
    }
    
    public class TestAnonyInner2{
    	public static void main(String[] args){
    		Student s1 = new Student();
    		s1.play();
    
    
    		Person james = new Person("james"){
    			@Override
    			public void play(){
    				System.out.println("dunkdunkdunk!!!");
    			}
    		};
    		james.play();
    	}
    }
    abstract class Person{
    	String name;
    	public Person(String name){
    		this.name = name;
    	}
    	public abstract void play();
    }
    
    class Student extends Person{
    	public Student(){
    		super("庫裏");
    	}
    	@Override
    	public void play(){
    		System.out.println("我是三分大神");
    	}
    }
    
發佈了26 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章