为什么一定要加final

本文介绍了一个使用Java Swing创建简单GUI应用程序的例子。该程序包括一个按钮、标签和文本框,当点击按钮时,标签会显示文本框中的内容。文章展示了如何使用监听器处理按钮点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MylistenerDemo03 {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  JFrame frame = new JFrame("欢迎来到幻界");
  final JButton but = new JButton("显示");
  final JLabel lab = new JLabel();
  final JTextField text = new JTextField(10);
  JPanel pan = new JPanel();
  Font font =new Font("Serief",Font.ITALIC + Font.BOLD,28);
  lab.setFont(font);
  lab.setText("等待用户输入信息!");
  but.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    if(e.getSource()== but){
     lab.setText(text.getText());
    }
   }
  });
  frame.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e){
    System.out.println("窗口正在关闭....");
   }
  });
  frame.setLayout(new GridLayout(2,1));
  pan.setLayout(new GridLayout(1,2));
  pan.add(text);
  pan.add(but);
  frame.add(pan);
  frame.add(lab);
  frame.pack();
  frame.setSize(300, 150);
  frame.setLocation(150, 200);
  frame.setVisible(true);
 }

}

 

 

为什么上面的JButton,JLabel,JTextField都要加上final才能运行

### @RequiredArgsConstructor 注解下变量必须 final 的原因及作用 #### 1. 构造函数生成机制 `@RequiredArgsConstructor` 是 Lombok 提供的一个注解,用于自动生成一个构造函数。此构造函数包含了所有被 `final` 关键字修饰以及标记有 `@NonNull` 注解的成员变量作为其参数[^1]。 ```java public class Example { private final String name; } ``` 上述代码中,Lombok 将自动为 `Example` 类创建如下构造函数: ```java public class Example { private final String name; public Example(String name) { this.name = name; } } ``` #### 2. 确保不可变性 当字段被定义为 `final` 时,在 Java 中意味着一旦初始化之后就不能再改变它的值。这有助于保持对象状态的一致性和线程安全性。对于那些应该在整个生命周期内都保持不变的对象属性来说非常重要[^3]。 #### 3. 防止部分初始化 如果某个类拥有多个非静态成员变量而没有显式的构造器,则可能会存在这些变量未被正确初始化的情况。通过强制要求将参与构造过程中的依赖项声明成 `final` 形式,可以有效防止这种情况的发生,从而提高程序健壮性[^4]。 #### 4. 支持依赖注入 在 Spring 应用上下文中使用 `@RequiredArgsConstructor` 可以简化 Bean 定义方式,并且能够实现基于构造器的依赖注入模式。此时只有标注了 `final` 或者带有特定约束条件(如 `@NonNull`)的属性才会参与到 DI 过程当中去[^2]。 ```java @Slf4j @Service @RequiredArgsConstructor public class OrderService { // 此处必须final 来确保可以通过构造器完成依赖注入 private final ApplicationContext applicationContext; // ... other methods ... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值