java內部類與匿名類詳解
阿新 • • 發佈:2021-09-08
內部類
一個類的內部又完整的嵌套了另一個類結構。被巢狀的類稱為內部類。
類的五大成員:屬性,方法,構造器,程式碼塊,內部類。
內部類與區域性內部類
class Outer { private int n= 100; private void m2() { } public void m1() { class Inner //區域性內部類 { //可以直接訪問外部類的所有成員,包括私有 //內部類相當於區域性變數,不能新增訪問修飾符,但是可以使用final修飾 //作用域:僅僅在定義它的方法或程式碼塊中 private int n= 20; public void f() { System.out.println(n);//20 //當外部類與區域性類重名 就近原則,呼叫外部類 外部類名.this.成員 System.out.println(Outer.this.n);//100 m2(); } } //建立區域性內部類 Inner inner = new Inner(); inner.f(); } //內部類,定義在成員位置上,相當於一個類的成員 //可以新增任何修飾符 public class Inner2() { public void say() { System.out.println(666); } } }
匿名內部類(超重點)
作用:簡化開發,對於某些物件只需要存在一次,則可用匿名類。
1.本質是類 2.內部類 3. 該類沒有名字 4.同時是一個物件
class Outer2 { private int n2 = 10; public void method() { //匿名內部類 //fish 的編譯型別 A //fish 的執行型別 Outer2$1 //在底層 自動分配一個類 //class Outer2$1 implements A // { // @Override // public void cry() // { // System.out.println("fish cry"); // } // } A fish= new A() { @Override public void cry() { System.out.println("fish cry"); } }; fish.cry(); System.out.println(fish.getClass());//Outer2$1 //class Outer2$2 extends Father Father father=new Father("pig") { @Override public void test() { System.out.println("pig eat"); } }; father.test(); } } interface A //介面 { public void cry(); } class Father { public Father(String name) {} public void test() {} }
練習
public class AnonmousClass { public static void main(String[] args) { CellPhone cellPhone = new CellPhone(); cellPhone.alarmClock(new Bell() { @Override public void ring() { System.out.println("wake up"); } }); cellPhone.alarmClock(new Bell() { @Override public void ring() { System.out.println("go to study"); } }); } } interface Bell { void ring(); } class CellPhone { public void alarmClock(Bell bell)//形參型別是Bell { bell.ring();//實現方法 } }