【编程】面向对象编程和函数式编程
文章目录
- 面向对象编程
- 主要特性
- 抽象类和接口的区别
- 函数式编程
- 函数式接口
- Lambda表达式
- Stream API
面向对象编程
主要特性
- 面向对象编程有四个主要特性:封装、继承、多态和抽象。
封装:通过private、protected、public控制访问权限,提供getter、setter方法。
- 访问修饰符:
- private:属性和方法,只能在定义的它们的类的内部被访问。
- default:默认,包访问权限。同一包中其他类可以访问。不同包中的类无法访问。
- protected:同一包中的任何类,不同包中的子类,均可访问。
- public:无访问权限,可以在任何地方被访问。
继承:子类继承父类。单继承、多实现。继承的类,实现的接口。
多态:
编译时多态(静态多态):方法重载。
运行时多态(动态多态):方法重写和向上转型(父类引用指向子类对象Animal myAnimal1 = new Dog();)。
- 重载与重写的区别:
- 重写:子类继承父类,并重写父类方法。
- 重载:多个同名方法,参数列表不同(参数类型、参数个数、参数顺序不同)。
抽象类和接口的区别
- 抽象类支持单继承,接口支持多实现。
- 抽象类中可包含抽象方法和具体方法,接口中Java8之前只能有抽象方法。
- 抽象类中成员变量可以是普通变量或常量,接口中只能是public static final。
函数式编程
函数式接口
只包含一个抽象方法的接口。@FunctionalInterface注解确保接口是函数式接口。
Lambda表达式
- 基本语法:
- 无参数,无返回值:() -> System.out.println(“Hello, Lambda!”);
- 有一个参数,无返回值:(x) -> System.out.println(x);
- 有多个参数,有返回值:(a, b) -> a + b;
Stream API
- 更方便的对集合数据进行复杂的处理。
- 具有延迟执行的特性,中间操作(如filter、map等)不会立即执行,只有在遇到终端操作(如sum、collect等)时才会触发整个流水线的执行。可以避免不必要的计算,提高性能。
传统for循环
int sum = 0;
for (Integer num : numbers) {
if (num % 2 == 0) {
sum += num * num;
}
}
System.out.println(sum);
Stream流
int sum = numbers.stream()
.filter(num -> num % 2 == 0)
.mapToInt(num -> num * num)
.sum();
System.out.println(sum);