• 六.内部类(成员内部类,静态内部类,局部内部类,匿名内部类)


    1.内部类概念:内部类不是在一个java源文件中编写俩个平行的俩个类,而是在一个类的内部再定义另外一个类。我们可以把外边的类称为外部类,在其内部编写的类称为内部类。

    2.内部类分为四种:成员内部类、静态内部类、局部内部类、匿名内部类

      1)成员内部类(实例内部类、非静态内部类)
      注:成员内部类中不能写静态属性和方法

      public class InstanceOutterClass{
        private String name;
        private static int age;
        public void say(){}
        public static void go(){}
        public class InstanceInnerClass{}//成员内部类
      }

      2)静态内部类
      注:静态内部类中可以写静态属性和方法

      public class StaticOutterClass{
        private String name;
        private static int num;
        public void say(){}
        public static void go(){}
        public static class StaticInnerClass{}
      }

      3)局部内部类
      //局部内部类是在一个方法内部声明的一个类
      //局部内部类中可以访问外部类的成员变量及方法
      //局部内部类中如果要访问该内部类所在方法中的局部变量,那么这个局部变量就必须是final修饰的

      public class LocalOutterClass{
        private String name;
        private static int age;
        public void say(){}
        public static void go(){}
        public void test(final int j){
          final int i = 10;
          class LocalInnerClass{
            private String name;
            private int age;
            public void say(){
              System.out.println(name);
              System.out.println(this.name);
              System.out.println(LocalInnerClass.this.name);
              System.out.println(LocalOutterClass.this.name);
              System.out.println(LocalOutterClass.age);
              LocalOutterClass.this.say();
              LocalOutterClass.go();
              System.out.println(i);
              System.out.println(j);
            }
          }
          LocalInnerClass lic = new LocalInnerClass();
          lic.say();
        }
      }

      4)匿名内部类
      //匿名内部类是最常用的一种内部类
        1)匿名内部类需要依托于其他类或者接口来创建
          如果依托的是类,那么创建出来的匿名内部类就默认是这个类的子类
          如果依托的是接口,那么创建出来的匿名内部类就默认是这个接口的实现类。
        2)匿名内部类的声明必须是在使用new关键字的时候
          匿名内部类的声明及创建对象必须一气呵成,并且之后能反复使用,因为没有名字。
         例如:
         A是一个类(普通类、抽象类都可以)
         依托于A类创建一个匿名内部类对象
         main:
         A a = new A(){
          //实现A中的抽象方法
          //或者重写A中的普通方法
         };
         注:这个大括号里面其实就是这个内部类的代码,只不过是声明该内部类的同时就是要new创建了其对象,并且不能反复使用,因为没有名字。
         例如:
         B是一个接口
         依托于B接口创建一个匿名内部类对象
         B b = new B(){
          //实现B中的抽象方法
         };
        3)匿名内部类除了依托的类或接口之外,不能指定继承或者实现其他类或接口,同时也不能被其他类所继承,因为没有名字。

        4)匿名内部类中,我们不能写出其构造器,因为没有名字。

        5)匿名内部类中,除了重写上面的方法外,一般不会再写其他独有的方法,因为从外部不能直接调用到。(间接是调用到的)

         public interface Work{
           void doWork();
         }
         public class AnonymousOutterClass{
           private String name;
           private static int age;
           public void say(){}
           public static void go(){}
           public void test(){
             final int i = 90;
             Work w = new Work(){
               public void doWork(){                      
                 System.out.println(AnonymousOutterClass.this.name);
                 System.out.println(AnonymousOutterClass.age);
                 AnonymousOutterClass.this.say();
                 AnonymousOutterClass.go();
                 System.out.println(i);
               }
             };
             w.doWork();
           }
         }                

    3.思考:内部类的意义.(为什么要写内部类)一般来说,内部类与当前类有着紧密的联系

      静态内部类(静态成员内部类)
      成员内部类
      局部内部类

      !匿名内部类!:没有名字,寄生于类或者接口,声明的同时创建对象
      (抽象类和接口创建不了对象,衍生出了匿名内部类来实现与继承,从而创建出子类/实现类的对象,调用到父类的方法)
      匿名内部类是不是都基于类和接口实现?

      使用方法:
        new 类/接口{
          //匿名内部类代码
        }
        类/接口 obj = new 类/接口{
          //匿名内部类代码
          //方法重写/实现
        }
        List<Student> list=new List<Student>() {
          //必须重写方法
        };

    三种匿名内部类的实现方法实例:

        public class Student{
          public void test(Action a){
            a.run();
          }
        }
        public interface Action{
          public void run();
        }
        //三种匿名内部类的实现方法
        main:
         Student stu=new Student();
         Action a=new Action(){
          public void run(){
           System.out.printf("hello");
          }
         }
         Action a2=new Action(){
          public void run(){
           System.out.printf("hi!!");
          }
         }
         stu.test(a);
         stu.test(a2);
         stu.test(new Action(){
           public void run(){System.out.printf("wow!");}
         });
         stu.test(()->{.......});//jdk:1.8新特性
  • 相关阅读:
    杂记
    实战:PSP上运行Windows 95
    [英语阅读笔记] CodeSnip: Uploading Multiple Files At Once
    整理网上的一些关于sharepoint编码方面的最佳实践 Virus
    ASP.NET、SharePoint中另存文件的长文件名被截断的原因及解决办法 Virus
    一个由Erlang引发的故事,关于语言和工资的故事 Virus
    ASP.NET统计图表控件 Virus
    关于验证码的思考 Virus
    Design Pattern 设计模式【观察者】 Virus
    moss开发实施过程中遇到的问题总结:项目层面 Virus
  • 原文地址:https://www.cnblogs.com/Magic-Li/p/12790864.html
Copyright © 2020-2023  润新知