public class Main {
public static void main(String[] args) {
Outer o = new Outer();
o.print();
o.method1();
}
}
/*
* 匿名內部類
* 就是內部類的簡化寫法
* 前提:存在一個類或者接口
* 這里的類可以是具體類也可以是抽象類
* 格式:
* new 類名或者接口名() {
* 重寫方法;
* };
*本質是:
* 是一個繼承了該類或者是實現了該接口的子類匿名對象
* */
//創建一個接口
interface Inter {
public void method();
}
//先用有名字的內部類實現外部接口
class Outer {
//內部類實現外部接口
class Inner implements Inter {
public void method(){
System.out.println("這是一個內部類實現接口");
}
}
//再整個方法
public void print(){
Inner i = new Inner();
i.method();
}
//匿名內部其實是局部內部類,必須放在方法中
public void method1 (){
//注意匿名內部類的書寫格式
//new 后面如果是類名就是繼承自父類的名字
//如果是接口名,就是這個類要實現的接口
//整個這個代表子類對象,那么可以調用這個重寫后的method方法。要好好理解下
new Inter () {//實現Inter接口
public void method(){
System.out.println("我是一個匿名內部類");
}
}.method();//這后面這個分號不能丟了
}
}
Pragma mark — NO.2 匿名內部類調用多個重寫方法
public class Nimingneibulei1 {
public static void main (String[] args){
Test1 t = new Test1();
t.method();
}
}
//匿名內部類中重寫多個方法調用
interface Inter1 {
public void show1();
public void show2();
}
class Test1 {
//通過如下例子我們就建議匿名內部類就用在只調用一個方法的情況
public void method(){
//匿名內部類
// new Inter1() {
//
// public void show1(){
//
// System.out.println("這是show1方法");
// }
// public void show2(){
// System.out.println("這是show2方法");
// }
//
// }.show1();
//
// new Inter1() {
//
// public void show1(){
//
// System.out.println("這是show1方法");
// }
// public void show2(){
// System.out.println("這是show2方法");
// }
//
// }.show2();
//換個簡單點的寫法
Inter1 i = new Inter1() {
public void show1(){
System.out.println("這是show1方法");
}
public void show2(){
System.out.println("這是show2方法");
}
};
i.show1();
i.show2();
}
}
Pragma mark — NO.3 匿名內部類的應用
public class Nimingneibulei2 {
public static void main (String[] args){
//我們要求是調用PersonDemo中的method方法
PersonDemo pd = new PersonDemo();
//這里要求我們傳一個抽象類對象,但是抽象類對象不能夠初始化。
//所以要我們傳一個匿名內部類進去,這里不能直接傳抽象類對象,我們可以
//傳兩種,要么傳有名的子類對象,要么傳匿名內部對象
// Person p = new Student();
// pd.method(p);
//我們用匿名內部類來做一下--匿名內部類當做參數傳遞,把匿名內部類當做一個對象
pd.method(new Person(){
//重寫show()方法
public void show(){
System.out.println("匿名內部類實現");
}
});
}
}
//寫個抽象類
abstract class Person{
public abstract void show();
}
//普通類
class PersonDemo {
public void method(Person p){
p.show();
}
}
//再創建個子類對象去繼承抽象類
class Student extends Person {
public void show(){
System.out.println("我是一個有名的子類");
}
}