zoukankan      html  css  js  c++  java
  • 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();
      }
    });

     

  • 相关阅读:
    谷粒商城学习——P52商品服务-API-三级分类-新增效果
    验证码爆破总结
    利用crawlergo-to-xray实现自动化漏洞被动扫描平台搭建
    数据导入经验总结
    SQL实现2个日期之间的工作日数(MySQL)(转)
    MySQL查询所有表的数据量
    crontab定时配置(转)
    SQLyog还原会话失败
    Nginx以xxx开头的转发
    mysql备份shell脚本
  • 原文地址:https://www.cnblogs.com/douyunpeng/p/13596850.html
Copyright © 2011-2022 走看看