跨类调用User类getter/setter方法报找不到符号如何解决
错误原因
两个核心问题直接触发报错,还有一个逻辑缺失会导致功能无法正常运行:
- 方法调用方式错误:
getFirstName()是User类的实例方法,没有static修饰,不能直接通过类名.方法名()的形式调用。这类方法必须绑定一个具体实例化的User对象才能运行,你写User.getFirstName()时,编译器会去查找User类下声明的静态getFirstName()方法,找不到自然抛出"cannot find symbol"错误。 - 逻辑时序错误:你在
initComponents()(GUI初始化阶段)就试图设置欢迎语,但这个阶段还没完成用户登录校验、也没有拿到当前登录用户的对象引用,就算改对调用语法也拿不到正确的用户名。 - 逻辑缺失:
Open启动类里只有存储所有用户的列表,没有单独保存「当前登录成功的用户」的变量,GUI根本不知道要取哪个用户的名字。
实例方法和静态方法的核心调用规则:
- 被
static修饰的方法/变量属于类本身,全局唯一,可以直接用类名调用 - 无
static修饰的方法/变量属于每个new出来的对象个体,必须拿到具体对象的引用才能调用
修复方案
按以下步骤修改代码即可:
1. 调整realGUI类逻辑
给GUI类增加持有当前用户的能力,把欢迎语设置逻辑从初始化阶段挪到拿到用户之后:
public class realGUI extends javax.swing.JFrame { // 存储当前登录的用户对象 private User currentUser; public realGUI() { initComponents(); } // 登录成功后调用该方法传入当前用户,更新欢迎语 public void setCurrentUser(User user) { this.currentUser = user; MainPageName.setText("Hello " + currentUser.getFirstName() + "!"); } private void initComponents() { MainPageName = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); roombookingbutton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); // 删除原位置错误的User.getFirstName()调用,初始化时先设置默认文本 MainPageName.setText("Hello!"); jLabel2.setText("Reservations"); roombookingbutton.setText("Book a Room"); roombookingbutton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { roombookingbuttonActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(148, 148, 148) .addComponent(roombookingbutton)) .addGroup(layout.createSequentialGroup() .addGap(162, 162, 162) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(MainPageName, javax.swing.GroupLayout.DEFAULT_SIZE, 74, Short.MAX_VALUE)))) .addContainerGap(150, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(MainPageName) .addGap(35, 35, 35) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 160, Short.MAX_VALUE) .addComponent(roombookingbutton) .addGap(45, 45, 45)) ); pack(); } // 补全原代码缺失的按钮点击事件方法,避免编译报错 private void roombookingbuttonActionPerformed(java.awt.event.ActionEvent evt) { // 此处填写订房按钮的业务逻辑 } // Swing自动生成的组件变量声明,不要遗漏 private javax.swing.JLabel MainPageName; private javax.swing.JLabel jLabel2; private javax.swing.JButton roombookingbutton; }
2. 调整Open启动类逻辑
补上当前登录用户的存储,在登录校验通过后把用户对象传给GUI:
import java.util.ArrayList; import java.io.IOException; public class Open { public static realGUI ah = new realGUI(); public static ArrayList<User> users = new ArrayList<>(); public static Serialise ser = new Serialise(); public static Deserialise deSer = new Deserialise(); // 新增:存储当前登录成功的用户 public static User currentLoginUser; public static void main(String[] args) { try { users = deSer.egg(); } catch(IOException err){ err.printStackTrace(); } // 替换为你自己的登录校验逻辑:校验用户名密码匹配后,从users列表找到对应用户赋值给currentLoginUser // 以下为示例代码 currentLoginUser = users.get(0); // 把当前用户传给GUI,触发欢迎语更新 ah.setCurrentUser(currentLoginUser); ah.setVisible(true); } public static void addUser(String username, String password, String firstName, String lastName){ User user = new User(username, password, firstName, lastName); users.add(user); } }
3. 跨类调用注意事项
- 跨类传递数据不要硬靠静态变量耦合,给需要数据的类写好setter方法(比如上面的
setCurrentUser),拿到数据后再更新界面 - 不要在界面初始化阶段就试图获取还没传递进来的动态数据,等数据到位后再更新对应组件内容
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

