匿名内部类

匿名内部类

匿名内部类可以使你的代码更加简洁,你可以在定义一个类的同时对其进行实例化。它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类

匿名内部类的定义格式:
接口名称 对象名 = new 接口名称() {
// 覆盖重写所有抽象方法
};

对格式“new 接口名称() {…}”进行解析:

new代表创建对象的动作
接口名称就是匿名内部类需要实现哪个接口
{…}这才是匿名内部类的内容
另外还要注意几点问题:

匿名内部类,在【创建对象】的时候,只能使用唯一一次。
如果希望多次创建对象,而且类的内容一样的话,那么就需要使用单独定义的实现类了。
匿名对象,在【调用方法】的时候,只能调用唯一一次。
如果希望同一个对象,调用多次方法,那么必须给对象起个名字。
匿名内部类是省略了【实现类/子类名称】,但是匿名对象是省略了【对象名称】
强调:匿名内部类和匿名对象不是一回事!!!

package com.xxxx.lambda;
/* 

- 匿名内部类:简化一些没有自己作用实现类,可以选择使用匿名内部类简化

-  */
  public class Demo01 {
  public static void main(String[] args) {
  	//new Demo().swimming();
  	

  //匿名内部類1
  //创建一个对象  没有名字的实现类的对象   是Swim接口的实现类的对象
  new Swim() {  //没有名字 的实现类的类型
  	@Override
  	public void swimming() {
  		// TODO Auto-generated method stub
  		
  	}@Overridepublic void haha() {// TODO Auto-generated method stub
  ​		
  ​	}
  }.swimming();;

  //匿名對象 : 只能在当前行使用一次
  new String("aaa").toString();//匿名内部类 2
  Swim o = new Swim() {
  	@Override
  	public void swimming() {
  		System.out.println("打死犟嘴的,淹死会水的..");
  	}@Overridepublic void haha() {// TODO Auto-generated method stub
  ​		
  ​	}
  };

  o.swimming();
  o.swimming();
  o.swimming();
  o.swimming();
  o.haha();

  //匿名内部类3
  test(new Swim() {@Overridepublic void swimming() {
  ​		System.out.println("hhhhhhhhhh");}@Overridepublic void haha() {// TODO Auto-generated method stub
  ​		
  ​	}});

  }

  //聚会  会游泳的
  static void  test(Swim s) {
  	s.swimming();
  }
  }

class Person{
	String name;
	

void eat() {}

}
interface Swim{
	void swimming();
	void haha();
}

class ZhangSan extends Person{}

class Lisi extends Person implements Swim{

@Override
public void swimming() {
	System.out.println("边喝水边游泳...");
}

@Override
public void haha() {
	// TODO Auto-generated method stub
	
}

}

//class Demo implements Swim{
//
//	@Override
//	public void swimming() {
//		System.out.println("边吃饭边游泳...");
//		
//	}
//}

Lambda表达式

  • 一个 Lambda 表达式可以有零个或多个参数
  • 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
  • 所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
  • 空圆括号代表参数集为空。例如:() -> 42
  • 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
  • Lambda 表达式的主体可包含零条或多条语句
  • 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空
/*

- jdk1.8 新增Lambda表达式

- 作用:  简化匿名内部类的

- 使用前提: 函数式接口

- 函数式接口: 只有一个必须被重写的抽象方法的接口

- 强制检测是否为函数式接口: 注解@FunctionalInterface

- 

- 语法:

- () -> {}

- ():匹配要重写的抽象方法的参数列表

- ->:lambda符号  箭头符号 具有上下文推倒的作用

- {}::匹配要重写的抽象方法的方法体

-  */
  public class Lambda02 {
  public static void main(String[] args) {
  	//匿名内部类
  	/*
  	 * Smoke ss = new Smoke() {
  	 * 
  	 * @Override public void smoking() { System.out.println("00000"); } };
  	 */
  	

  //lambda1

  //		Smoke s = ()->{
  //			System.out.println("11111");
  //			System.out.println("11111");
  //		};
  //		s.smoking();
  //		s.smoking();
  //		s.smoking();
  	

  //lambda2 方法体中如果方法体语句只有一句,方法体前后的{}可以省略

  //		Smoke s = ()->System.out.println("11111");
  //		s.smoking();
  //		s.smoking();
  //		s.smoking();
  	
  	

  //lambda3  如果有参数,参数的数据类型可以省略

  //		Smoke s = (a, b)->System.out.println("11111"+a+b);
  //		s.smoking(1,2);
  //		s.smoking(2,3);
  //		s.smoking(4,5);
  	

  //lambda4  如果有参数只有一个,前后的()可以省略

  //		Smoke s = a->System.out.println("11111"+a);
  //		s.smoking(1);
  //		s.smoking(2);
  //		s.smoking(4);
  	

  //lambda5 如果语句体还有一句,并且3还是return语句,return关键字 以及前后{}可以一起省略
  Smoke s = a-> "返回"+a;

  System.out.println(s.smoking(2));;
  System.out.println(s.smoking(3));;

  }
  }

@FunctionalInterface
interface Smoke{
	String smoking(int a);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值