Java基础——匿名内部类详解及举例

说明:定义在外部类的局部位置,比如方法中,并且没有类名
匿名内部类的使用
  1. 匿名内部类的基本语法
new 类或接口(参数列表){
    类体
};
  1. 用途:有些时候为了简化开发,创建一个基于接口或者基于类的新的类,但这个类我只使用一次,后面不再使用,按照传统的写法new一个新类或者接口有点太浪费了,于是用匿名内部类来简化开发
  2. 基于接口的匿名内部类
public class AnonymouslnnerClass {
    public static void main(String[] args) {
        Outer04 o=new Outer04();
        o.method();
    }
}

class Outer04{  //外部类
    private int n1 = 10;    //属性
    public void method(){      //方法
        //基于接口的匿名内部类
        A tiger = new A(){
            @Override
            public void cry() {
                System.out.println("老虎叫叫。。。");
            }
        };
        tiger.cry();
    }
}

//接口
interface A{
    public void cry();
}
  1. 基于类的匿名内部类
public class AnonymouslnnerClass {
    public static void main(String[] args) {
        Outer04 o=new Outer04();
        o.method();
    }
}
class Outer04{  //外部类
    private int n1 = 10;    //属性
    public void method(){      //方法
        //基于类的匿名内部类
        //1、father编译类型 Father
        //2、father运行类型 Outer$1
        Father father=new Father("jack"){
            @Override
            public void test() {
                System.out.println("匿名内部类重写的test方法");
            }
        };
        System.out.println("father对象的运行类型:"+father.getClass());
        father.test();
    }
}
class Father{       //类
    public Father(String name){     //构造器
    }
    public void test(){     //方法

    }
}		//输出:father对象的运行类型:class 匿名内部类.Outer04$1
  1. 基于抽象类的匿名内部类
public class AnonymouslnnerClass {
    public static void main(String[] args) {
        Outer04 o=new Outer04();
        o.method();
    }
}

class Outer04{  //外部类
    private int n1 = 10;    //属性
    public void method(){      //方法
        //基于抽象类的匿名内部类
            Animal animal = new Animal(){
                @Override
                void cry() {
                    System.out.println("zoo");
                }
            };
            animal.cry();

    }
}

abstract class Animal{
    abstract void cry();
}
匿名内部类举例:
  • 有一个铃声接口Bell,里面有一个ring方法。
  • 有一个手机类Cellphone,具有闹钟功能alarmClock,参数是Bell类型。
  • 测试手机类的闹钟功能,通过匿名内部类(对象)作为参数,打印:懒猪起床了
  • 再传入另一个匿名内部类(对象),打印:小伙伴上课了
package 匿名内部类;

public class InnerClassExercise02 {
    public static void main(String[] args) {
        Cellphone cellphone=new Cellphone();
        cellphone.alarmClock(new Bell() {
            @Override
            public void ring() {
                System.out.println("懒猪起床了!");
            }
        });
        cellphone.alarmClock(new Bell() {
            @Override
            public void ring() {
                System.out.println("小伙伴们起床了!");
            }
        });
    }
}

class Cellphone{
    public void alarmClock(Bell bell){
        bell.ring();
    }
}

interface Bell{
    void ring();
}

匿名内部类注意的细节

1. 匿名内部类语法比较奇特,请大家注意,因为匿名内部类既是一个类的定义,同时它本身也是一个对象,因此从语法上看,它既有定义类的特征,也有出创建对象的特征,对前面代码分析可以看出这个特点,因此可以调用内部类方法。
2. 可以直接访问外部类的所有成员,包含私有的
3. 不能添加访问修饰符,因为它的地位就是一个局部变量。
4. 作用域:仅仅在定义它的方法或代码块中。
5. 匿名内部类--访问--->外部类的成员函数  [访问方式:直接访问]
6. 外部其他类--->不能访问--->匿名内部类(因为 匿名内部类地位是一个局部变量)
7. 如果外部类和匿名内部类的成员重名时,匿名内部类访问的话,默认遵循就近原则,如果想访问外部类的成员,则可以使用 (外部类名.this.成员)去访问。