Java基础面试题(06)—— 内部类,匿名内部类,Lambda表达式
前言
学习项目的过程中,我觉得自己有点太急功近利了一直跟着视频敲没有自己的思考(主要是最近在牛客读到了一位大佬👍👍👍,程序员牛肉的文章),🙌学技术不是一味的复制粘贴,特别是做项目,要边学边思考,一个功能的实现,我学会了什么技术,还有没有更好的可以替代它。
之前学的基础知识其实也没有学完,像集合,线程… 都还不知道是啥就开始学JavaWeb做项目了,在项目中使用队列存储我都一脸懵,在这里以问题的形式写一个学习笔记🤔,不仅仅是复习,也为以后的面试做准备,还有还有我的刷题网站是面试鸭呦🦆🦆🦆
先来看看什么是内部类,然后一步一步了解 表达式
Java内部类(Inner Class)是指在一个类的内部定义的另一个类。内部类是Java语言的一个重要特性,它允许你将一个类的定义嵌套在另一个类的内部,从而实现更紧密的逻辑关联和更好的封装。
1. 内部类主要有以下几种类型:
1. 成员内部类(Member Inner Class)
定义在另一个类的内部,但不在方法或代码块中。
特点:
可以访问外部类的所有成员(包括私有成员)。
不能包含静态成员(除非是静态常量)。
创建实例时需要先创建外部类的实例。
public class Outer {
private String msg = "Hello";
class Inner {
void print() {
System.out.println(msg); // 可以访问外部类的私有成员
}
}
}
// 使用
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.print();
2. 静态内部类(Static Nested Class)
使用 static 修饰的内部类。
特点:
不能直接访问外部类的非静态成员。
创建实例时不需要外部类的实例。
public class Outer {
static class StaticInner {
void display() {
System.out.println("Static Inner Class");
}
}
}
// 使用
Outer.StaticInner inner = new Outer.StaticInner();
inner.display();
3. 局部内部类(Local Inner Class)
定义在方法或作用域内的类。
特点:
只能在定义它的方法或作用域内使用。
可以访问外部类的成员,以及所在方法的final或有效final变量(Java 8+)。
public class Outer {
void method() {
final int localVar = 10;
class LocalInner {
void print() {
System.out.println(localVar);
}
}
new LocalInner().print();
}
}
4. 匿名内部类(Anonymous Inner Class)
- 是一种特殊的局部内部类
- 所谓匿名:指的是程序员不需要为这个类声明名字,默认有个隐藏的名字。
特点:匿名内部类本质就是一个子类,并会立即创建出一个子类对象
作用:用于更方便的创建一个子类对象。
new 类或接口(参数值...){
类体(一般是方法重写);
}
示例:
public abstract class Animal {
public abstract void cry();
}
public static void main (String [] args) {
Animal a = new Animal(){
public void cry() {
System.out.println("hhhhhh");
}
};
a.cry();
}
匿名内部类使用:
//给按钮添加一个点击事件监听器对象,这样就可以监听用户的点击操作,就可以做出反应
public static void main (String [] args) {
...
JButton btn = new JButton ("登录");
panel.add(btn);
//开发中不是我们要主动去写匿名内部类,而是用别人的功能的时候,别人可以让我们写一个匿名内部类
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("登陆成功!");
}
)
}
函数式编程Lambda表达式:使用Lambda函数替代某些匿名内部类对象,从而使程序代码更简洁
(被重写方法的形参列表)->{
被重写方法的方法体代码
}
💡注意:Lambda表达式只能替代函数式接口的匿名内部类
函数式接口:
- 有且仅有一个抽象方法的接口
- 大部分函数式接口,上面都可能会有一个@FunctionalInterface的注解
public static void main (String [] args) {
//匿名内部类:
Swim s1 = new Swim() {
public void swimming () {
System.out.println("hhhhhhh");
}
}
//lambda表达式:
Swim s1 = () -> {
System.out.println("hhhhhhh");
}
s1.swimming();
}
//函数式接口,只有一个抽象方法的接口
@FunctionalInterface //生命函数式接口的注解
interface Swim{
void swimming();
}
小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)
…。。。。。。。。。。。…
…。。。。。。。。。。。…
更多推荐



所有评论(0)