- 一、内部类
- 1.1成员内部类
- 内部类三个特点
- 内部类产生对象的两种方式
- 1.2静态内部类
- 与成语内部类最大的区别
- 静态内部类能否定义自己的成员域
- 1.3方法内部类
- 1.4匿名内部类(方法内部类的一种)
- 二、Lambda表达式
- 2.1接口中引入default普通方法
- 2.2函数式接口
- 2.3Lambda表达式——匿名内部类(互相转换)
- 2.4Lambda表达式的四种情况
- 无返回值无参数
- 无返回值有参数
- 有返回值无参数
- 有返回值有参数
一、内部类
私有内部类:inner类对于outter类外部完全隐藏,除了Outter类,外部完全无法使用Inner类(类似二叉树的节点类,因为节点类对外部没有意义也无法使用,只能二叉树这个类内部进行修改访问)
产生内部类对象要先产生外部类的对象,这个外部类对象会被自动传入内部类。
在成员内部类访问外部fun()方法,使用外部类对象调用,例如下图Outter.this.fun()
内部类一定可以访问外部类的静态域:
例如可以直接打印成员属性msg和静态属性age
1.静态内部类是无法直接访问外部类的成员属性的,没有外部类的对象,没有对象就无法访问成员属性,例如下图不能直接打印外部类属性msg。但是如果内部类中产生外部类的对象,还是可以访问外部属性的,例如下图黄色框中代码所示
2.静态内部类可以直接访问外部类的静态属性
一定是可以的,例如上图中静态内部类的fun方法就是个普通方法。
静态内部类就是个普通的类,只不过嵌套在外部类中。
直接访问的意思是不产生外部类对象就能访问,但如果产生外部类对象还是可以访问的。
解释以下第三点:
在这个内部类中是无法修改外部方法中的属性或者变量的,因为出了方法内部类这个类之后,这个类就不存在了,现在在里面修改属性之后对于外部是不可见得。
方法内部类一律不存在静态变量
大多数情况用在实参
比如:之前最大堆实现的接口就包含匿名内部类
Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式(Lambda expression)可以看作是一个匿名函数,基于数学中的λ演算得名,也可称为闭包(Closure) 。
2.1接口中引入default普通方法 2.2函数式接口注意事项:
- 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
- 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。
@FunctionalInterface
interface NoParameterNoReturn {
void test();
default void test2() {
System.out.println("JDK1.8新特性,default默认方法可以有具体的实现");
}
}
2.3Lambda表达式——匿名内部类(互相转换)
使用Lambda表达式的前提:接口必须是函数接口,接口中只有一个抽象方法
public class TestDemo {
public static void main(String[] args) {
NoParameterNoReturn noParameterNoReturn = ()->{
System.out.println("无参数无返回值"); };
noParameterNoReturn.test();
MoreParameterNoReturn moreParameterNoReturn = (int a,int b)->{
System.out.println("无返回值多个参数:"+a+" "+b); };
moreParameterNoReturn.test(20,30)
此时的a是匿名内部类自己的参数,所以可以修改x的值,如果是外部属性,例如下图中的num就只能读取,不能修改
OneParameterNoReturn oneParameterNoReturn = (int a)->{
System.out.println("无参数一个返回值:"+ a);
};
oneParameterNoReturn.test(10);



