1. 程式人生 > 其它 >JavaSE基礎知識——內部類

JavaSE基礎知識——內部類

JavaSE基礎知識——內部類使用說明 目錄

1. 什麼是內部類

  • 類的內部成員之五:內部類
  1. Java中允許將一個類A宣告在另一個類B中,則類A就是內部類,類B稱為外部類
  2. 內部類的分類:成員內部類(靜態、非靜態) vs 區域性內部類(方法內、程式碼塊內、構造器內)

  1. 成員內部類:
  • 一方面,作為外部類的成員:

呼叫外部類的結構
可以被static修飾
可以被4種不同的許可權修飾

  • 另一方面,作為一個類:
  • 類內可以定義屬性、方法、構造器等
  • 可以被final修飾,表示此類不能被繼承。言外之意,不使用final,就可以被繼承
  • 可以被abstract修飾

  1. 關於內部類應該關注如下的3個問題
    1.如何例項化成員內部類的物件
    2.如何在成員內部類中區分呼叫外部類的結構
    3.開發中區域性內部類的使用 見《InnerClassTest1.java》

2. 內部類使用參考程式碼

public class InnerClassTest {
	public static void main(String[] args) {
		
		//建立Dog例項(靜態的成員內部類):
		Person.Dog dog = new Person.Dog();
		dog.show();
		//建立Bird例項(非靜態的成員內部類):
//		Person.Bird bird = new Person.Bird();//錯誤的  非靜態需要例項化後才能呼叫
		Person p = new Person();   //例項化類
		Person.Bird bird = p.new Bird();   // 
		bird.sing();
		
		System.out.println();
		
		bird.display("黃鸝");
		
	}
}


class Person{
	
	String name = "小明";
	int age;
	
	public void eat(){
		System.out.println("人:吃飯");
	}
	
	
	//靜態成員內部類
	static class Dog{
		String name;
		int age;
		
		public void show(){
			System.out.println("卡拉是條狗");
//			eat();
		}
		
	}
	//非靜態成員內部類
	class Bird{
		String name = "杜鵑";
		
		public Bird(){
			
		}
		
		public void sing(){
			System.out.println("我是一隻小小鳥");
			Person.this.eat();//呼叫外部類的非靜態屬性
			eat();
			System.out.println(age);
		}
		
		public void display(String name){
			System.out.println(name);//方法的形參
			System.out.println(this.name);//內部類的屬性
			System.out.println(Person.this.name);//外部類的屬性
		}
	}
	
	
	public void method(){
		//區域性內部類——方法內
		class AA{
			
		}
	}
	
	{
		//區域性內部類——程式碼塊內
		class BB{
			
		}
	}
	
	public Person(){
		//區域性內部類——構造器內
		class CC{
			
		}
	}
	
	
	
}

3. 匿名內部類


  • 匿名內部類不能定義任何靜態成員、方法和類,只能建立匿名內部類的一個例項。一個匿名內部類一定是在 new 的後面,用其隱含實現一個介面或實現一個類。
  • 格式:
  • new 父類構造器(實參列表)|實現介面(){
    //匿名內部類的類體部分
    }
  • 匿名內部類的特點
    匿名內部類必須繼承父類或實現介面
    匿名內部類只能有一個物件
    匿名內部類物件只能使用多型形式引用

4. 匿名內部類使用參考程式碼


public class InnerClassTest1 {
	
	
	//開發中很少見
	public void method(){
		//區域性內部類
		class AA{
			
		}
	}
	
	
	//返回一個實現了Comparable介面的類的物件
	public Comparable getComparable(){
		
		//建立一個實現了Comparable介面的類:區域性內部類
		//方式一:
//		class MyComparable implements Comparable{
//
//			@Override
//			public int compareTo(Object o) {
//				return 0;
//			}
//			
//		}
//		
//		return new MyComparable();
		
		//方式二:
		return new Comparable(){

			@Override
			public int compareTo(Object o) {
				return 0;
			}
			
		};
		
	}
	
}