2020年9月1日 内部类的分类、成员内部类、局部内部类、匿名内部类

/*
* 1、内部类:
* 定义在另外一个类里面的类,就叫做内部类,为了区别,把外面的类称为外部类。
*
* 2、分类
* 根据内部类的所在的位置不同:
* (1)成员内部类:外部类中方法外
* (2)局部内部类:方法体内,(虽然也可以在代码块内,但是不讨论这个)
*
*
* 成员内部类:
* (1)有static修饰的:静态成员内部类,我们通常就简称为静态内部类
* (2)没有static修饰的:非静态成员内部类,我们通常就简称为成员内部类
* 【修饰符】 class 外部类{
* 【其他修饰符】 static class 静态内部类{
* }
* 【其他修饰符】 class 非静态成员内部类{
* }
* }
*
* 【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{
* 【其他修饰符】 static class 静态内部类 【extends 父类】 【implements 父接口们】{
* }
* 【其他修饰符】 class 非静态成员内部类 【extends 父类】 【implements 父接口们】{
* }
* }
* 说明:外部类、内部类的父类、父接口没有关系,各是各的
*
*
* 局部内部类:
* (1)有名字的局部内部类:简称局部内部类
* (2)没名字的局部内部类:简称匿名内部类
*
* 局部内部类的语法格式:
* 【修饰符】 class 外部类 【extends 父类】 【implements 父接口们】{
* 【修饰符】 返回值类型 方法名(【形参列表】){
* 【修饰符】 class 有名字的局部内部类 【extends 父类】 【implements 父接口们】{
* ...
* }
* }
* }
*
* 匿名内部类的语法格式:
* 特殊
*/

7.10.1 匿名内部类

1、语法格式:

//在匿名子类中调用父类的无参构造
new 父类(){
   内部类的成员列表
}

//在匿名子类中调用父类的有参构造
new 父类(实参列表){
   内部类的成员列表
}

//接口没有构造器,那么这里表示匿名子类调用自己的无参构造,调用默认父类Object的无参构造
new 父接口名(){
   
}

2、匿名内部类、匿名对象的区别?

System.out.println(new Student("张三"));//匿名对象

Student stu = new Student("张三");//这个对象有名字,stu

//既有匿名内部类,又是一个匿名的对象
new Object(){
   public void test(){
      .....
  }
}.test();

//这个匿名内部类的对象,使用obj这个名字引用它,既对象有名字,但是这个Object的子类没有名字
Object obj = new Object(){
   public void test(){
      .....
  }
};

3、使用的形式

(1)示例代码:继承式

abstract class Father{
   public abstract void test();
}
class Test{
   public static void main(String[] args){
       //用父类与匿名内部类的对象构成多态引用
       Father f = new Father(){
           public void test(){
               System.out.println("用匿名内部类继承了Father这个抽象类,重写了test抽象方法")
          }
      };
       f.test();
  }
}

(2)示例代码:实现式

interface Flyable{
   void fly();
}
class Test{
   public static void main(String[] args){
       //用父接口与匿名内部类的对象构成了多态引用
       Flyable f = new Flyable(){
           public void fly(){
               System.out.println("用匿名内部类实现了Flyable这个接口,重写了抽象方法");
          }
      };
       f.fly();
  }
}

(3)示例代码:用匿名内部类的匿名对象直接调用方法

new Object(){
   public void test(){
       System.out.println("用匿名内部类的匿名对象直接调用方法")
  }
}.test();

(4)示例代码:用匿名内部类的匿名对象直接作为实参

Student[] all = new Student[3];
all[0] = new Student("张三",23);
all[1] = new Student("李四",22);
all[2] = new Student("王五",20);

//用匿名内部类的匿名对象直接作为实参
//这个匿名内部类实现了Comparator接口
//这个匿名内部类的对象,是定制比较器的对象
Arrays.sort(all, new Comparator(){
   public int compare(Obeject o1, Object o2){
       Student s1 = (Student)o1;
       Student s2 = (Student)o2;
       return s1.getAge() - s2.getAge();
  }
});

 

原文地址:https://www.cnblogs.com/douyunpeng/p/13596850.html