zoukankan      html  css  js  c++  java
  • java-07 内部类、匿名内部类、局部内部类、lambda

    本文主要记录内部类、匿名内部类、局部内部类、lambda表达式的用途和lambda表达式的推导及使用

    1.直接内部类

      直接内部类可以分为两种: 成员内部类和静态内部类

      1.1 成员内部类

          成员内部类,就如同成员一样存在一个类中,该内部类可以直接访问外部类成员和方法,但是外部类不能使用内部类方法或者属性。

          成员内部类访问外部类属性或方法的方式: 外部类名.this.成员名/方法名

          成员内部类声明方式: (假设外部类叫Outer 内部类叫Inner)  Outer.Inner inner = new Outer().new Inner();

     1 public class TestInnerClass {
     2     private String name;  //外部类属性 
     3     private int age;
     4     
     5     
     6     class InnerClass{ //内部类以成员的方式存在外部类中
     7         public void test() {
     8             TestInnerClass.this.name = "张三";  //内部类修改外部类值 
     9         }
    10         
    11         public void print() {
    12             System.out.println(TestInnerClass.this.name);
    13         }
    14     }
    15     
    16     public static void main(String[] args) {
    17         //声明一个内部类对象
    18         TestInnerClass.InnerClass inner = new TestInnerClass().new InnerClass();
    19         inner.test(); 
    20         inner.print(); //张三
    21     }
    22 
    23 }

      1.2 静态内部类

          顾名思义,静态内部类就是以外部类静态成员的方式存在在一个类中 该内部类不依靠外部类对象(这一点与成员内部类不同!)

          同理,静态内部类可以访问外部类的静态成员或方法 

          声明一个静态内部类的方式:  (假设外部类叫Outer 内部类叫Inner) Outer.Inner inner = new Outer().Inner();

          

     1 public class TestInnerClass {
     2     private static String name;  //外部类属性 
     3     private int age;
     4     
     5     
     6     static class InnerClass{ //内部类以成员的方式存在外部类中
     7         public void test() {
     8             TestInnerClass.name = "张三";  //内部类修改外部类值 
     9         }
    10         
    11         public void print() {
    12             System.out.println(TestInnerClass.name);
    13         }
    14     }
    15     
    16     public static void main(String[] args) {
    17         //声明一个内部类对象
    18         TestInnerClass.InnerClass inner = new TestInnerClass.InnerClass();
    19         inner.test(); 
    20         inner.print(); //张三
    21     }
    22 
    23 }

    2.匿名内部类

        匿名内部类,实际上就是隐式的继承了一个接口或者抽象类,并实现该接口或抽象类的方法。

        注意:匿名内部类是不能有构造函数的,这也就决定了每一个匿名内部类是只会用一次的。同时匿名内部类是不能存在任何静态变量或方法的。如果内部类想调用外部变量 则外部变量必须是final的。

        语法  new 接口/抽象类 {  类体实现  }.调用方法()。

    interface Test{
        public void print();
    }
    
    public class TestNoName {
        public static void main(String[] args) {
            
            new Test() {
                
                @Override
                public void print() {
                    // TODO Auto-generated method stub
                    System.out.println("我是一个接口的匿名抽象类方法");
                }
            }.print();
            
        }
    }

    3.局部内部类

        局部内部类就是方法内部的内部类,基本不使用,这里不介绍,请大家自行了解。

    4.lambda表达式

        lambda表达式时java8中一个重要的特性,虽然看起来非常高大上,实际上只是java的一个语法糖,最后还是由我们的编译器编译成正常的代码,不过对于程序员来说编写代码会更轻松,代码会更简洁。

        基本语法:(params) ->  expression   或者  (params) -> {语句;}

    // 1. 不需要参数,返回值为 5  
    () -> 5  
      
    // 2. 接收一个参数(数字类型),返回其2倍的值  
    x -> 2 * x  
      
    // 3. 接受2个参数(数字),并返回他们的差值  
    (x, y) -> x – y  
      
    // 4. 接收2个int型整数,返回他们的和  
    (int x, int y) -> x + y  
      
    // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
    (String s) -> System.out.print(s)

        一些例子:

        

    String[] atp = {"Rafael Nadal", "Novak Djokovic",  
           "Stanislas Wawrinka",  
           "David Ferrer","Roger Federer",  
           "Andy Murray","Tomas Berdych",  
           "Juan Martin Del Potro"};  
    List<String> players =  Arrays.asList(atp);  
      
    // 以前的循环方式  
    for (String player : players) {  
         System.out.print(player + "; ");  
    }  
      
    // 使用 lambda 表达式以及函数操作(functional operation)  
    players.forEach((player) -> System.out.print(player + "; "));  
       
    // 使用匿名内部类  
    btn.setOnAction(new EventHandler<ActionEvent>() {  
              @Override  
              public void handle(ActionEvent event) {  
                  System.out.println("Hello World!");   
              }  
        });  
       
    // 或者使用 lambda expression  
    btn.setOnAction(event -> System.out.println("Hello World!"));
    // 1.1使用匿名内部类  
    new Thread(new Runnable() {  
        @Override  
        public void run() {  
            System.out.println("Hello world !");  
        }  
    }).start();  
      
    // 1.2使用 lambda expression  
    new Thread(() -> System.out.println("Hello world !")).start();  
      
    // 2.1使用匿名内部类  
    Runnable race1 = new Runnable() {  
        @Override  
        public void run() {  
            System.out.println("Hello world !");  
        }  
    };  
      
    // 2.2使用 lambda expression  
    Runnable race2 = () -> System.out.println("Hello world !");  
       
    // 直接调用 run 方法(没开新线程哦!)  
    race1.run();  
    race2.run();
  • 相关阅读:
    CF1284G
    5-3 Harbor高可用部署 下
    5业务系统迁移kubernetes-----准备工作(平稳迁移做好准备)
    题解-CF1453F Even Harder
    题解-CF961F k-substrings
    Docker 数据卷容器(实现两个或多个容器间数据同步)
    Docker 具名和匿名挂载
    Java-IO中的节点流和处理流
    《机器学习十讲》学习报告二
    rpc基本思路
  • 原文地址:https://www.cnblogs.com/xiaobai1202/p/10836469.html
Copyright © 2011-2022 走看看