内部类
1.内部类的基本使用
package com.lu.day03;
public class Student {
private int b= 12;
public class A{
private int b = 11;
public void show(){
int b = 10;
System.out.println("我是A");
System.out.println(b);
System.out.println(this.b);
System.out.println(Student.this.b);
}
}
}
package com.lu.day03;
public class Test {
public static void main(String[] args) {
Student.A a = new Student().new A();
a.show();
}
}
使用特点一般将其私有化外部不允许使用
内部类特点访问特点:
内部类可以直接访问外部类的成员,包括私有
外部类访问内部类成员必须创建对象
2.局部内部类
局部内部类不能用访问控制修饰符(如 public、private、protected)以及 static 修饰符来修饰。
总结:鬼都不用,为了解决多继承问题后来有了接口就不用了
含义:方法中定义的类
使用特点: 1.只能在方法中创建对象并使用 2.能访问外部类成员,也可以方法内局部变量
3.匿名内部类
作用:一般用在桌面编程(比如xmand,我的世界)
package com.lu.day03.test;
public class Test {
public static void main(String[] args) {
Sing s = new Sing() {
@Override
public void a(){
System.out.println("我是a");
}
public void b(){
System.out.println("我是b");
}
};
new Sing(){
@Override
public void a() {
System.out.println("我是a");
}
public void b(){
System.out.println("我是b");
}
};
}
}
想用到b方法必须在接口中有声明
匿名对象: 没有名字(引用)的对象,只使用一次
前提: 存在一个类或者接口,这里的类可以是具体类也可以是抽象类
定义匿名内部类的语法格式如下 new 类名或者接口名() {重写方法;}
本质:是一个继承了该类的子类匿名对象,或者是实现了该接口的实现类匿名对象
Lamda表达式
package com.lu.day03.test;
public class Test1 {
public static void main(String[] args) {
Sing sing = () -> System.out.println("我是a");
sing.a();
Sing s = ()->{
System.out.println("我是a");
};
s.a();
}
}
使用规则:只能是接口而且接口中只能有一个方法
package com.lu.day03.test;
@FunctionalInterface//(只有一个抽象方法的接口叫做函数接口)
public interface Sing {
void a();
}
1.lambda省略模式
package com.lu.day03.test2;
/**
* lambda表达式省略模式
*/
public class Test {
public static void main(String[] args) {
//省略模式1参数类型可以省略,但要省略就全部省略
Sing sing = (a,b)->{
System.out.println("我会唱"+a+"还会唱"+b);
};
sing.sing("最后一页","荷塘月色");
//省略模式2参数只有一个小括号可以省略
Play p = name ->{
System.out.println(name);
};
p.play("王者");
//省略模式三方法体内如果只有一条语句可以省略大括号,如果有返回值必须xie return语句,如果return只有一句那么也可以省略
Add add = (a,b)->a+b;
System.out.println(add.add(2, 4));
}
}
2.面向对象与面向函数最大的区别
lamda表达式与匿名内部类的区别
面试题
1.解释Java函数式编程lambda表达式的闭包,以及如何解决闭包的问题
解决闭包问题把基本数据类型变成引用数据类型
2.什么是构造器引用以及方法引用,使用条件是什么
构造器引用和方法引用是 Java 8 中引入的特性,它们可以简化 Lambda 表达式的编写,使代码更加简洁和易读。
构造器引用:
构造器引用的语法格式是:类名称::new
。它是方法引用的一种变体,用于引用类的构造函数。
使用条件是:需要创建一个与函数式接口中抽象方法的参数列表相匹配的类的实例。例如,如果有一个函数式接口的抽象方法接受某些参数并返回一个对象,而正好存在一个类的构造函数的参数列表与之匹配,就可以使用构造器引用。
方法引用:
方法引用是对已存在方法的直接引用,可以看作是 Lambda 表达式的一种更简洁的写法。
方法引用的格式有以下三种:
对象::实例方法
:引用对象的实例方法,::
前表示被引用的对象,::
后表示被引用对象的实例方法。类::静态方法
:引用类的静态方法,::
前表示被引用的类,::
后表示被引用类的静态方法。类::实例方法
:本质上也是引用对象的实例方法,只是对象是 Lambda 表达式的第一个形参。::
前表示被引用对象所属的类,::
后表示被引用对象的实例方法。
使用方法引用需要满足以下条件:
- Lambda 体中只有一句语句,并且是通过调用一个对象的或类现有的方法来完成的。
- 针对不同的格式,有具体的参数和返回值类型要求:
- 对于
对象::实例方法
,函数式接口中的抽象方法在被重写时使用了某一个对象的方法,如果方法的形参列表、返回值类型都相同,则可以使用该方法实现对抽象方法的重写、替换。此方法是实例方法,需要对象调用。 - 对于
类::静态方法
,函数式接口中的抽象方法在被重写时使用了某一个类的静态方法,如果方法的形参列表、返回值类型都相同,则可以使用该静态方法实现对抽象方法的重写、替换。此方法是静态方法,需要类调用。 - 对于
类::实例方法
,函数式接口中的抽象方法在被重写时使用了某一个对象的方法,如果抽象方法的返回值类型与该实例方法的返回值类型相同,同时抽象方法的形参列表中有 n 个参数,实例方法的形参列表有 n - 1 个参数,且抽象方法的第 1 个参数作为实例方法的调用者,且抽象方法的后 n - 1 参数与实例方法的 n - 1 参数匹配(类型相同或满足多态场景也可以)。此方法是非静态方法,需要对象调用,但形式上是写成对象所属的类来调用。
- 对于