You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java开发疑问:能否访问其他类方法中的局部变量?

问题描述

我正在开发一个简易书店菜单系统,系统包含两个菜单选项:选项1调用createAccount()完成用户注册,选项2用于查看会员列表。我尝试在BookstoreMenu类的switch-case 2中通过bc对象访问BookstoreController类createAccount()方法内的局部变量strArray,但未成功。请问能否访问其他类方法中的局部变量?

相关代码

BookstoreRun 类

public class BookstoreRun {
    public static void main(String[] args) {
        BookstoreMenu bm = new BookstoreMenu();
        bm.mainMenu();
    }
}

BookstoreMenu 类

public class BookstoreMenu {
    private Scanner sc = new Scanner(System.in);
    private BookstoreController bc = new BookstoreController();
    
    public void mainMenu() {
        System.out.println("1. SignUp");
        System.out.println("2. Check members list");
        System.out.println("Select menu : ");
        int menu = sc.nextInt();
        switch (menu) {
        case 1: {
            bc.createAccount();
            break;
        } case 2:
        default:
            System.out.println("...");
        }
    }
}

BookstoreController 类

public class BookstoreController {
    private Scanner sc = new Scanner(System.in);
    public void createAccount() {
        System.out.println("Let's get started");
        System.out.print("Your name : ");
        String[] strArray = new String[0];
        String name = sc.nextLine();
        strArray = saveId(strArray, name);
        
        System.out.print(name + ", Nice to meet you!");
        System.out.println(Arrays.toString(strArray));
    }
    
    public String[] saveId(String[] originArr, String name) {
        String[] newArr = new String[originArr.length + 1];
        
        System.arraycopy(originArr, 0, newArr, 0, originArr.length);

        newArr[originArr.length] = name;
        return newArr;
    }
}

回答

不能直接访问其他类方法中的局部变量。局部变量的作用域仅限于定义它的方法内部,方法执行完毕后变量会被销毁,外部完全无法直接感知或访问它。

你代码里的strArray是createAccount()的局部变量,仅在该方法执行期间存在,BookstoreMenu类根本无法直接获取它。要实现查看会员列表的功能,需要调整代码结构,把会员列表的存储从局部变量改为BookstoreController的成员变量,再提供外部可调用的获取方法。

修改方案

  1. 用List替代数组存储会员列表(更灵活,无需手动扩容),并将其设为BookstoreController的成员变量
  2. 修改createAccount()方法,将新用户添加到成员变量中
  3. 新增获取会员列表的方法,供外部调用

修改后的 BookstoreController 类

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class BookstoreController {
    private Scanner sc = new Scanner(System.in);
    // 成员变量存储会员列表
    private List<String> memberList = new ArrayList<>();
    
    public void createAccount() {
        System.out.println("Let's get started");
        System.out.print("Your name : ");
        // 处理sc.nextInt()遗留的换行符,避免读取空字符串
        sc.nextLine();
        String name = sc.nextLine();
        memberList.add(name);
        
        System.out.print(name + ", Nice to meet you!");
        System.out.println(memberList);
    }
    
    // 提供外部获取会员列表的方法,返回副本避免内部数据被直接修改
    public List<String> getMemberList() {
        return new ArrayList<>(memberList);
    }
}

修改后的 BookstoreMenu 类

import java.util.Scanner;

public class BookstoreMenu {
    private Scanner sc = new Scanner(System.in);
    private BookstoreController bc = new BookstoreController();
    
    public void mainMenu() {
        while (true) { // 增加循环,支持重复操作
            System.out.println("1. SignUp");
            System.out.println("2. Check members list");
            System.out.println("3. Exit");
            System.out.println("Select menu : ");
            int menu = sc.nextInt();
            switch (menu) {
                case 1:
                    bc.createAccount();
                    break;
                case 2:
                    System.out.println("Members list: " + bc.getMemberList());
                    break;
                case 3:
                    System.out.println("Exit...");
                    return;
                default:
                    System.out.println("Invalid option, please try again.");
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者maricenaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:20:41