Java基礎--匿名內部類
阿新 • • 發佈:2018-09-10
span sys rac sed hid 具體類 分析 urn 開發
一、什麽是匿名內部類
就是內部類的簡化寫法
前提:存在一個類或者接口(這裏的類可以是具體類也可以是抽象類)
格式:new 類名或者接口名(){
重寫方法;
}
二、匿名內部類的本質是什麽?
是一個繼承了該類或者實現了該接口的子類的匿名對象
class Demo1_NoNameInnerClass { public static void main(String[] args) { Outer o = new Outer(); o.method(); } } interface Inter { public void print(); }View Codeclass Outer { public void method(){ //Inner i = new Inner(); //i.print(); //new Inner().print(); //Inter i = new Inner(); //父類引用指向子類對象 new Inter() { //實現Inter接口 public void print() { //重寫抽象方法 System.out.println("print"); } }.print(); } }
三、匿名內部類重寫多個方法調用
class Demo2_NoNameInnerClass { public static void main(String[] args) { Outer o = new Outer(); o.method(); } } interface Inter { public void show1(); public void show2(); } //匿名內部類只針對重寫一個方法時候使用 class Outer { public void method() {View Code/*new Inter(){ public void show1() { System.out.println("show1"); } public void show2() { System.out.println("show2"); } }.show1(); new Inter(){ public void show1() { System.out.println("show1"); } public void show2() { System.out.println("show2"); } }.show2();*/ Inter i = new Inter(){ public void show1() { System.out.println("show1"); } public void show2() { System.out.println("show2"); } /*public void show3() { System.out.println("show3"); }*/ }; i.show1(); i.show2(); //i.show3(); //匿名內部類是不能向下轉型的,因為沒有子類類 名 } }
結論:匿名內部類只針對重寫一個方法時候使用
四、匿名內部類在開發中的應用
匿名內部類當做參數傳遞(本質把匿名內部類看做一個對象)
class Test1_NoNameInnerClass { 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"); } }View Code
簡單的說就是new 抽象類/接口,然後重寫方法。
五、匿名內部類的面試題
按照要求,補齊代碼
class OuterDemo{
public static void main(String[] args){
Outer.method().show();
}
}
interface Inter{
void show();
}
class Outer{
//補齊代碼
}
要求在控制臺輸出“HelloWorld”
分析:
Outer.method(),用類去調用方法說明該類是靜態的
Outer.method().show(),說明Outer.method()返回的是一個對象,有show方法的只有Inter
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”View Code
Java基礎--匿名內部類