Java基础学习day08
代码块
定义
- 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。
静态代码块:
格式
- static { }
特点
- 类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。
作用
- 完成类的初始化,例如:对静态变量的初始化赋值。
实例代码块:
格式
- { }
特点
- 每次创建对象时,执行实例代码块,并在构造器前执行。
作用
- 和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值。
内部类
定义
- 如果一个类定义在另一个类的内部,这个类就是内部类。
- 当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。
public class Car{ // 内部类 public class Engine{ } }
成员内部类
定义
- 就是类中的一个普通成员,类似前面我们学过的普通的成员变量、成员方法。
public class Outer { // 成员内部类 public class Inner { } } 创建对象的格式: 外部类名.内部类名 对象名 = new 外部类(...).new 内部类(...); Outer.Inner in = new Outer().new Inner();
访问特点
- 1、成员内部类种可以直接访问外部类的实例成员、静态成员。
- 2、成员内部类的实例方法中,可以直接拿到当前外部类对象,格式是:外部类名.this 。
静态内部类
定义
- 有static修饰的内部类,属于外部类自己持有。
public class Outer{ // 静态内部类 public static class Inner{ } } 外部类名.内部类名 对象名 = new 外部类.内部类(…); Outer.Inner in = new Outer.Inner();
访问特点
- 可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。
局部内部类(了解)
定义
- 局部内部类是定义在在方法中、代码块中、构造器等执行体中。
匿名内部类
定义
- 是一种特殊的局部内部类;
- 所谓匿名:指的是程序员不需要为这个类声明名字,默认有个隐藏的名字。
new 类或接口(参数值…) { 类体(一般是方法重写); }; new Animal(){ public void cry() { } };
特点
- 匿名内部类本质就是一个子类,并会立即创建出一个子类对象。
作用
- 用于更方便的创建一个子类对象。
常见方式
- 通常作为一个对象参数传输给方法。
应用场景
- 调用别人提供的方法实现需求时,这个方法正好可以让我们传输一个匿名内部类对象给其使用。
案例
public class Test { public static void main(String[] args) { Student[] students = new Student[3]; students[0] = new Student("玛卡巴卡", 16, 170.1); students[1] = new Student("唔西迪西", 12, 158.2); students[2] = new Student("依古比古", 18, 168.5); Arrays.sort(students, new Comparator<Student>() { public int compare(Student o1, Student o2) { return o1.getAge() - o2.getAge(); } }); System.out.println(Arrays.toString(students)); } }
函数式编程
认识Lambda
定义
- 此“函数”类似于数学中的函数(强调做什么),只要输入的数据一致返回的结果也是一致的
解决问题
- 使用Lambda函数替代某些匿名内部类对象,从而让程序代码更简洁,可读性更好。
Lambda表达式
- JDK 8开始新增的一种语法形式,它表示函数。
- 可以用于替代某些匿名内部类对象,从而让程序更简洁,可读性更好。
(被重写方法的形参列表) -> { 被重写方法的方法体代码。 }
函数式接口
- 有且仅有一个抽象方法的接口。
注意事项
- Lambda表达式只能替代函数式接口的匿名内部类!!!
- 将来我们见到的大部分函数式接口,上面都可能会有一个@FunctionalInterface的注解,该注解用于约束当前接口必须是函数式接口。
案例
Arrays.sort(students, new Comparator<Student>() { public int compare(Student o1, Student o2) { return o1.getAge() - o2.getAge(); } }); Arrays.sort(students, (Student o1, Student o2) -> { return o1.getAge() - o2.getAge(); });
省略规则
作用
- 用于进一步简化Lambda表达式的写法。
具体规则
- 参数类型全部可以省略不写。
- 如果只有一个参数,参数类型省略的同时“()”也可以省略,但多个参数不能省略“()” 。
- 如果Lambda表达式中只有一行代码,大括号可以不写,同时要省略分号“;”如果这行代码是return语句,也必须去掉return。