前言

学习项目的过程中,我觉得自己有点太急功近利了一直跟着视频敲没有自己的思考(主要是最近在牛客读到了一位大佬👍👍👍,程序员牛肉的文章),🙌学技术不是一味的复制粘贴,特别是做项目,要边学边思考,一个功能的实现,我学会了什么技术,还有没有更好的可以替代它。

之前学的基础知识其实也没有学完,像集合,线程… 都还不知道是啥就开始学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();
}

小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)

…。。。。。。。。。。。…请添加图片描述

…。。。。。。。。。。。…

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐