1. 程式人生 > 其它 >JAVA中的內部類(匿名,區域性)

JAVA中的內部類(匿名,區域性)

技術標籤:java

JAVA中的內部類(匿名,區域性)

###10.08_面向物件(內部類概述和訪問特點)(瞭解)

  • A:內部類概述
  • B:內部類訪問特點
    • a:內部類可以直接訪問外部類的成員,包括私有。
    • b:外部類要訪問內部類的成員,必須建立物件。
    • 外部類名.內部類名 物件名 = 外部類物件.內部類物件;
  • C:案例演示
    • 內部類極其訪問特點

###10.09_面向物件(成員內部類私有使用)(瞭解)

  • private

###10.10_面向物件(靜態成員內部類)(瞭解)

  • static
  • B:成員內部類被靜態修飾後的訪問方式是:
    • 外部類名.內部類名 物件名 = 外部類名.內部類物件;

###10.11_面向物件(成員內部類的面試題)(掌握)

  • A:面試題
  •   要求:使用已知的變數,在控制檯輸出30,20,10。
      
      class Outer {
      	public int num = 10;
      	class Inner {
      		public int num = 20;
      		public void show() {
      			int num = 30;
      			System.out.println(?);
      			System.out.println(??);
      			System.out.println(???);
      		}
      	}
      }
      class InnerClassTest {
      	public static void main(String[] args) {
      		Outer.Inner oi = new Outer().new Inner();
      		oi.show();
      	}	
      }
    

###10.12_面向物件(區域性內部類訪問區域性變數的問題)(掌握)

  • A:案例演示
    • 區域性內部類訪問區域性變數必須用final修飾

    • 區域性內部類在訪問他所在方法中的區域性變數必須用final修飾,為什麼?
      因為當呼叫這個方法時,區域性變數如果沒有用final修飾,他的生命週期和方法的生命週期是一樣的,當方法彈棧,這個區域性變數也會消失,那麼如果區域性內部類物件還沒有馬上消失想用這個區域性變數,就沒有了,如果用final修飾會在類載入的時候進入常量池,即使方法彈棧,常量池的常量還在,也可以繼續使用

      但是jdk1.8取消了這個事情,所以我認為這是個bug

###10.13_面向物件(匿名內部類的格式和理解)

  • A:匿名內部類
    • 就是內部類的簡化寫法。
  • B:前提:存在一個類或者介面
    • 這裡的類可以是具體類也可以是抽象類。
  • C:格式:
  •   new 類名或者介面名(){
      	重寫方法;
      }
    
  • D:本質是什麼呢?
    • 是一個繼承了該類或者實現了該介面的子類匿名物件。
  • E:案例演示
    • 按照要求來一個匿名內部類

###10.14_面向物件(匿名內部類重寫多個方法呼叫)

  • A:案例演示
    • 匿名內部類的方法呼叫

###10.15_面向物件(匿名內部類在開發中的應用)

  • A:程式碼如下
  •   //這裡寫抽象類,介面都行
      abstract class Person {
      	public abstract void show();
      }
    
      class PersonDemo {
      	public void method(Person p) {
      		p.show();
      	}
      }
    
      class PersonTest {
      	public static void main(String[] args) {
      		//如何呼叫PersonDemo中的method方法呢?
      		PersonDemo pd = new PersonDemo ();
      		
      	}
      }
    
class PersonTest {
	public static void main(String[] args) {
		//如何呼叫PersonDemo中的method方法呢?
		PersonDemo pd = new PersonDemo ();
		//pd.method(new Student());
		pd.method(new Person() {
			public void show() {
				System.out.println("show");
			}
		});
	}
}
//這裡寫抽象類,介面都行
abstract class Person {
	public abstract void show();
}

class PersonDemo {
	
	//public void method(Person p) {		//Person p = new Student();		//父類引用指向子類物件
	/*
	Person p = new Person(){
		public void show() {
			System.out.println("show");
		}
	};
	*/
	public void method(Person p) {
		p.show();
	}
}

class Student extends Person {
	public void show() {
		System.out.println("show");
	}
}

###10.16_面向物件(匿名內部類的面試題)

  • A:面試題
  •   按照要求,補齊程式碼
      interface Inter { void show(); }
      class Outer { //補齊程式碼 }
      class OuterDemo {
      	public static void main(String[] args) {
      		  Outer.method().show();
      	  }
      }
      要求在控制檯輸出”HelloWorld”
    
class Test2_NoNameInnerClass {
	public static void main(String[] args) {
		//Outer.method().show();			//鏈式程式設計,每次呼叫方法後還能繼續呼叫方法,證明呼叫方法返回的是物件
		Inter i = Outer.method();
		i.show();
	}
}
//按照要求,補齊程式碼
interface Inter { 
	void show(); 
}

class Outer { 
	//補齊程式碼 
	public static Inter method() {
		return new Inter() {
			public void show() {
				System.out.println("show");
			}
		};
	}
}

//要求在控制檯輸出”HelloWorld”