先理解匿名内部类

  • 不是真正意义上的类,实际上是一个对象
new Swim(){
	@Override
	public void swim() {
		System.out.println("重写了游泳的方法”);
	}
};

最开始swim与new都没有,这时就是一个没名字的类,swim就是他实现的接口或者继承的类,new则是将没名字的类实例化,()则是代表用的是无参构造

  • 因为他是一个对象,可以直接传入方法中,而他又有继承或是实现的状态,这时天然构成了方法要传入的父类参指向子类对象,也就是多态,编译看父类有没有此方法,运行则直接调用子类的相关方法
Swim s = new Swim(){
	@Override
	public void swim() {
		System.out.println("重写之后游泳方法”);
	}
	s.swim();
	
	
	new Swim(){
	@Override
	public void swim() {
		System.out.println(“重写之后游泳方法”);
	}.swim();
  • Swim s = new swim()可以把他传给一个引用,随后通过s.来调用方法,同样他也可以在整个语句的最后.调用自己的方法

引入Lambda

  • 可以看到有用的只是System那一行,比较浪费,为了简化就有了Lambda(还是一个对象)
语法
() -> {
    System.out.println("hello");
}


//()中是参数,后面是方法体

也就是

new Runnable() {
    @Override
    public void run() {
        System.out.println("hello");
    }
}

的简化(只可以简化函数式接口,也就是只有一个抽象函数的接口)

运用
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("线程");
    }
}).start();

优化为

new Thread(() -> {
    System.out.println("线程");
}).start();
核心思想

只保留方法的内容,让编译器自己推断接口名,方法名,参数类型

  • 推断过程
    1.看Thread的构造函数,就匹配到了Runnable这个接口
    2.再查询里面的抽象方法run,随后知道了Lambda就要顶替run这个方法
    3.括号里就是形参,->后面就是执行的具体的逻辑,其余的返回值等等都会自动补齐

更多推荐