代码块
在Java类下,使用{ }括起来的代码被称为代码块
局部代码块
位置:方法中的一对{ }
作用:限定变量的生命周期,提早释放内存
构造代码块
位置:类中方法外的一对{ }
执行时机:创建对象的时候被调用执行,且优先于构造方法执行
作用:如果多个构造方法中存在相同的代码,可以考虑抽取到构造代码块中
静态代码块
位置:类中方法外的一对{ } ,需要被static修饰
执行时机:随着类的加载(字节码文件)而执行,且只执行一次
作用:用于加载项目的配置文件,或者是初始化文件
同步代码块
内部类
- 内部类就是定义在一个类里面的类
class Outer {
//内部类
class Inner {
}
}
- 创建对象的格式:
内部类成员访问
- 内部类中,访问外部类成员:直接访问,包括私有
- 外部类中,访问内部类成员:需要创建对象访问
class Outer {
int num = 10;
class Inner {
int num = 30;
public void show() {
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}
静态内部类
- 有
static
修饰的成员内部类
class Outer {
static class Inner {
}
}
静态内部类创建对象的格式
局部内部类
(鸡肋语法,了解即可)
- 局部内部类放在方法,代码块,构造器等执行体中
局部内部类的特性 (关键)
- 可以直接访问外部类的所有成员,包括私有的;
- 局部内部类的地 4类的地位相当于一个局部变量,因此不能添加访问修饰符,但可以使用final进行修饰;
- 作用域: 仅仅在定义它的方法或代码块中有效;
- 局部内部类访问外部类的成员:直接访问即可;
- 外部类访问局部内部类的成员:创建对象 -> 通过对象进行访问,
注意:需要在局部内部类的作用域中才可以; - 如果外部类和局部内部类的成员重名时,默认遵循就近原则,
如果就是想访问外部类的成员时,使用 [外部类名.this.成员] 的方式
匿名内部类
**概述:**匿名内部类本质上是一个特殊的局部内部类(定义在方法内部)
**前提:**需要存在一个接口或类
格式:
new 类名 / 接口 () {
}
匿名内部类可以使代码更加简洁,定义一个类的同时对其进行实例化
使用总结
匿名内部类可以作为方法的实际参数进行传输
使用场景:接口中的抽象方法,只有1~2个的时候
Lambda
Lambda表达式是jdk8开始后的一种新语法形式。
作用:简化匿名内部类的代码写法。
Lambda表达式的简化格式
注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式
什么是函数式接口?
- 首先必须是接口, 其次接口中有且仅有一个抽象方法的形式
Lambda表达式和匿名内部类的区别
使用限制不同
匿名内部类:可以操作类,接口
Lambda表达式:只能操作函数式接口
实现原理不同
匿名内部类:编译之后,产生一个单独的。class字节码文件
Lambda表达式:编译之后,没有一个单独的。class字节码文件