《Java核心技术 卷1》- 20240712

2024-07-11  本文已影响0人  转岗做JAVA
1. lambda表达式;
(String first, String second) -> first.length() - second.length()

var timer = new Timer(1000, event -> System.out.println(event));
// 也可以写成
// System.out::println是一个方法引用,会由编译器生成一个函数式接口实例;
var timer = new Timer(1000, System.out::println);
// 构造器引用,例如Person类
Stream<Person> stream = names.stream().map(Person::new);
public class Application {
    public void init() {
        ActionListener listener = event -> {
            System.out.println(this.toString()); // this指的是Application实例
            // ....
        }
    }
}
2. 内部类会持有外部类的实例。

编译器会修改所有内部类的构造器,添加一个对应外部类引用的参数。

内部类为啥能够访问外部类的私有字段:Java 11之前,编译器会为外部类生成类似access$0的静态方法以供调用,虚拟机并没有对其有特别的了解。Java 11以上,不再生成访问方法,虚拟机会了解类之间的嵌套关系。

3. 局部内部类

编译器会将使用的局部变量复制成其的一个不可变字段存储,所以即使出了局部变量的作用域,局部内部类仍然可以使用到;

4. 匿名内部类

如果构造参数列表结束小括号后面跟一个开始大括号,就是在定义匿名内部类。

var bob = new Object(){ String name = "Bob";}
System.out.println(bob.name); // "Bob"
var count = new Person("xxxx") { 
    {
        // initialization
    }
}
5. 静态内部类
6. try-with-resources 语句
try (Resource res1 =...; Resource res2 = ... ) {
    // work with res1 、res2
}
7. 通过StackWalker类可以获取实例流,其中每个实例分别描述一个栈帧;
StackWalker walker = StackWalker.getInstance();
walker.forEach(frame -> analyze frame)
walker.walk(stream -> process stream)
上一篇 下一篇

猜你喜欢

热点阅读