内部类

1 成员内部类创建对象  外部类.内部类     

对象名=new 外部类对象.new内部类对象

Outer.Inner i=new Quter().new Inner();

  内部类可以访问外部类私有

  外部类访问内部类 需要创建对象

  外部类名.内部类名 对象名=new 外部类对象.new内部类对象

  

       私有内部类 不能通过上述方法创建对象,在自己所在的内部类中创建对象

  静态内部类 创建对象   外部类名.内部类名 对象名=new 外部类名.内部类名();

  

package com.yang.innerClass;

public class Car {
    String brand="外部类小马";
    class Engin{
        String brand="内部类中马";
        public void run(){
            String brand="局部老马";
            System.out.println(brand+this.brand+Car.this.brand);
        }
    }

}

  

package com.yang.innerClass;

public class MTest {
    public static void main(String[] args) {
        Car.Engin c=new Car().new Engin();
        c.run();
    }
}

  

  

2 局部内部类(该类在类的成员方法中)

只能在内部类所在的方法中,创建对象并访问

该内部类可以访问外部类成员,也可以访问方法的局部变量

匿名内部类

  new 接口名 或者类名(){

    重写方法

}.方法

package com.yang.innerclass;

public class MTest {
    public static void main(String[] args) {
        new Inner(){
            public void study(){
                System.out.println("好好学习");
            }
            public void  show(){
                System.out.println("show......");
            }
        }.show();
    }
}

  想用两个方法  Inner i=new Inner(){实现}; i.方法;

package com.yang.innerclass;

public interface Inner {
    public abstract void study();
    public  void show();
}

  

Lambda表达式 函数式编程思想 (自己想做什么)

1 必须是接口

2 抽象方法数量必须是一个,只能是一;

三要素 形式参数 箭头 代码块

    (形式参数) -> {代码块}

package com.yang.Lambda;

public class TestLambda {
    public static void main(String[] args) {
        useShowHandler(()-> System.out.println("Labmbda使用方法"));
    }

    public static void useShowHandler(ShowHandler showHandler){
            showHandler.show();
    }
}
interface ShowHandler{
    void show();
}

  

package com.yang.Lambda;

public class TestLambda1 {
    public static void main(String[] args) {
        printMessage((String mes)->{
            System.out.println("匿名内部类"+mes);
        });
    }
    public static void printMessage(StringHander stringHander){
        stringHander.printMessage("王");
    }
}
interface StringHander{
    void printMessage(String mes);
}

 Lambda无参带有返回值 

package com.yang.innerReturn;

import java.util.Random;

public class MTest {
    public static void main(String[] args) {
        getNum(()->{
            Random random=new Random();
            int i=random.nextInt(10)+1;
            return i;
        });
    }
    public static void getNum(InnerHander innerHander){
        System.out.println(innerHander.getNum());
    }
}

  

package com.yang.innerReturn;

public interface InnerHander {
    int getNum();
}

Lambda 有参数有返回值  和上面的例子类似就不写了

Lambda省略模式  参数可以省略,如果参数有多个不能只省略一个,参数只有一个可以省略小括号,大括号中只有一条语句 大括号可以省略 renturn 可以省略,分号可以省略

package com.yang.innerReturn1;

import com.yang.innerReturn.InnerHander;

import java.util.Random;

public class MTest {
    public static void main(String[] args) {
        getNum(()-> new Random().nextInt(10)+1
        );
    }
    public static void getNum(InnerHander innerHander){
        System.out.println(innerHander.getNum());
    }
}

Lambda表达式和匿名内部类

匿名内部类 可以接口,可以抽象类,可以具体类。 编译后会产生独立字节码文件

Lambda 只能是接口 只能有一个抽象方法。编译后不会产生字节文件,对应的字节码会在运行中动态的生成。

原文地址:https://www.cnblogs.com/yang-qiu/p/15375833.html