Java开发中遇到匿名内部类使用外部类变量的情况

本文介绍了在Java开发中遇到的一个问题,即匿名内部类使用外部类的非final变量导致错误。作者在尝试改进一个猜数字游戏时,发现每次猜对后无法重新生成随机数。经过研究和导师指导,了解到需要将变量声明为静态以在匿名内部类中使用,从而解决了问题。博客旨在记录这一学习经历。

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

#博学谷IT学习技术支持#

目录

一、案例概述

二、问题描述

三、解决方案


一、案例概述

        在最近一周的学习中,学习涉及到了一个基础的案例。那便是用GUI做一个猜数字的界面并实现它的功能。这个案例的功能是比较容易实现的,就是搭建一个简易的界面:

        利用Random函数去生成一个1-100之间的随机数,并且给“我猜”按钮添加事件监听器去实现猜数字的功能便算是玩成了。案例完成后,我也尝试着运行,没有发现什么问题,可以正常地进行游戏。当我第一次猜对这个数字后,我尝试再次输入该数字,却它的结果还是“猜对了”。

二、问题描述

 下面为原来部分代码:

//生成1-100之间的随机数
Random r = new Random();
int number = r.nextInt(100) + 1;
//给我猜按钮添加事件监听器
        guess.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //猜的数字不可以为空
                //获取文本框的内容 判断
                String guessNumber = numberField.getText().trim();
                //guessnumber == null
                if (guessNumber.equals("")) {
                    JOptionPane.showMessageDialog(jf,"您输入的内容为空,请重新输入");
                    return;
                }
                //将获取的String类型的字符串转换为int类型
                int guessnumber = Integer.parseInt(guessNumber);
                //把两个数字进行比较,给出提示
                if (guessnumber > number) {
                    JOptionPane.showMessageDialog(jf,"你猜的数字" + guessnumber + "大了");
                    numberField.setText("");
                } else if (guessnumber < number) {
                    JOptionPane.showMessageDialog(jf,"你猜的数字" + guessnumber + "小了");
                    numberField.setText("");
                } else {
                    JOptionPane.showMessageDialog(jf,"恭喜你,猜对了");
                    numberField.setText("");
                    //再次生成随机数
                    number = r.nextInt(100) + 1;
                }
            }
        });

        由此,我发现它的随机数是每一次程序启动的时候才生成的,我便想改进这个情况。那便是我每次猜对数字之后,便立马又生成一个随机数,即使不重新启动程序,也可以继续进行猜数字游戏。于是我便在判断“猜对了”的情况下又增加了一条语句,但是系统却产生了错误信息。

这是我增加的代码:

//再次生成随机数
number = r.nextInt(100) + 1;

 报错情况如图:

 

        在我上网查阅后知道这是因为在匿名内部类中使用了外部类的变量。提示的解决方法便是将外部类的变量用final修饰。可是,如果用final修饰的话,那就相当于一个常量了,无法对它进行赋值操作,那便没有了意义。

三、解决方案

        最后,我咨询了我的导师,他给出了一个解决方案。便是将接收随机数这个变量,定义成一个静态成员变量。这样便可以直接在匿名内部类中进行使用了。

static int number;

至于为什么是静态的,因为main()方法便是static修饰的,而在静态方法中调用的成员变量,成员变量也应该是静态的。

        这是我学习中遇到的问题和解决方案,发该博客是为了记录遇到的这些情况,如有不足,请指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值