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的成员变量,再提供外部可调用的获取方法。
修改方案
- 用
List替代数组存储会员列表(更灵活,无需手动扩容),并将其设为BookstoreController的成员变量 - 修改
createAccount()方法,将新用户添加到成员变量中 - 新增获取会员列表的方法,供外部调用
修改后的 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
相关产品推荐
相关产品推荐

