• Anonymous Classes


    Notes

      They make code more consise

      We declare and instantiate them at the same time

      They like local classes but don't have a name

      We use them when we need them only once

    Declaring Anonymous Classes

      They are expressions, so we can define the class in another expression, for example.

     1 public class AnonymousClasses {
     2 
     3   interface HelloWorld{
     4     void greet();
     5     void greetSomeone(String someone);
     6   }
     7 
     8   public void sayHello(){
     9 
    10     // declaration of an local class
    11     class EnglishGreeting implements HelloWorld{
    12       String name = "world";
    13       @Override
    14       public void greet() {
    15         greetSomeone("world");
    16       }
    17 
    18       @Override
    19       public void greetSomeone(String someone) {
    20         name = someone;
    21         System.out.println("Hello " + name);
    22       }
    23     }
    24 
    25     HelloWorld englishGreeting = new EnglishGreeting();
    26 
    27     // declare and instantiate an anonymous class at the same time
    28     // in the initialization statements of the local variable
    29     HelloWorld frenchGreeting = new HelloWorld() {
    30       String name = "tout le monde";
    31       @Override
    32       public void greet() {
    33         greetSomeone("tout le monde");
    34       }
    35 
    36       @Override
    37       public void greetSomeone(String someone) {
    38         name = someone;
    39         System.out.println("Salut " + someone);
    40       }
    41     }; // do not forget the ;
    42 
    43     englishGreeting.greet(); // Hello world
    44     frenchGreeting.greetSomeone("Fred"); // Salut Fred
    45   }
    46 
    47   public static void main(String[] args) {
    48     new AnonymousClasses().sayHello();
    49   }
    50 }
    View Code

       

    Syntax of Anonymous Classes

      The new operator

      The name of an interface to implement or a class to extend

      Parentheses that contain the arguments to a constructor. Note: interface has no constructor, so use an empty parentheses

      A body, a class declaration body

      A semicolon. An anonymous class definition is an expression, which is a part of a statement, so must have a semicolon.

      

    Accessing Local Variables of the Enclosing Scope, and Declaring and Accesssing Members of the Anonymous Class

      Rules are presented in the following code

     1 public class AnonymousClasses {
     2 
     3   interface HelloWorld{
     4     void myTest();
     5   }
     6 
     7   public String author = "yang";
     8   public static final Integer age = 23;
     9 
    10   public void test(){
    11     System.out.println("method member of enclosing class");
    12   };
    13 
    14   public void sayHello(){
    15 
    16     String time = "2020/8/8";
    17     String sex = "female";
    18 
    19     // declare and instantiate an anonymous class at the same time
    20     // in the initialization statements of the local variable
    21     HelloWorld frenchGreeting = new HelloWorld() {
    22 
    23       // can access members of its enclosing class
    24       String myAuthor = author; // ok
    25       Integer myAge = age; // ok
    26 
    27       // can access local variables in enclosing scope
    28       // that are declared final or effectively final
    29       String myTime = time; // ok
    30 
    31       // shadow the sex variable defined in enclosing scope
    32       String sex = "male";
    33 
    34       // has the same restrictions as local classes to their members
    35 
    36       // can not declare static methods
    37 //      public static void init(){}
    38 
    39       // can not declare member interfaces
    40 //      interface person{}
    41 
    42       // can have static constant variables
    43       static final String school = "USTC";
    44 
    45       // Note that you can declare the following
    46       /**
    47        * Fields
    48        * Extra methods
    49        * Instance initializers
    50        * Local class
    51        */
    52       private Integer money = 100;
    53       private String city;
    54       public void extraMethod(){}
    55       public void instanceInitializers(String city){
    56         this.city = city;
    57       }
    58       class myInnerClass{}
    59       
    60       // can not declare constructors
    61 
    62       @Override
    63       public void myTest(){
    64         test(); // ok
    65       }
    66 
    67     }; // do not forget the ;
    68 
    69     frenchGreeting.myTest();
    70   }
    71 }
    View Code

    reference from: https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

      

  • 相关阅读:
    yum只下载不安装的方法
    在VS2008下编译Qt4.4.x
    Linux sh脚本异常:bad interpreter: No such file or directory
    动态链接库dll,静态链接库lib, 导入库lib 转
    Accumulation Buffer(累积缓存)
    mysql中ip和整数的转换
    开车撞人了!
    windows 下getc()返回0x1A表示EOF
    NPC问题
    关于普华永道、麦肯锡和IBM的笑话
  • 原文地址:https://www.cnblogs.com/yangwu-183/p/13460327.html
Copyright © 2020-2023  润新知