G1322 2024-04-19 15:23 采纳率: 0%
浏览 2

翁恺Java程序设计进阶/Java问题

img

img


为啥这里要新定义一个getvalue函数获取返回值
我试着直接在increased函数里用return返回,结果输出不对了

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-19 15:23
    关注

    引自免费微信小程序:皆我百晓生

    在 Java 中,getValue() 函数的作用是提供一个访问类内部变量 value 的公共接口。这样做有几个原因:

    1. 封装性(Encapsulation):将数据隐藏起来,并通过公共方法访问,这是面向对象编程的一个基本原则。这样可以保护数据不被随意修改,确保数据的一致性和安全性。

    2. 读写权限控制:如果你只提供了 getValue() 而没有提供直接修改 value 的方法,那么外部代码只能通过调用 increased() 方法来改变值,从而间接地控制 value 的变化。这种方式使得你可以添加额外的逻辑,比如检查限制条件等。

    3. 多态性(Polymorphism):如果你有多个子类继承了 display 类,它们可能有不同的计算规则,但外部代码可以通过统一的 getValue() 接口来获取值,无需关心具体实现细节。

    如果你想直接在 increased() 函数中返回值,这会导致以下问题:

    • 如果你在循环中调用 increased() 并打印返回值,每次调用都会立即返回新的值,而不是等待循环执行完再输出整个时间。
    • 这违背了封装原则,因为外部代码可以直接修改和获取 value,破坏了类的内部状态管理。

    为了保持代码结构良好并遵循面向对象编程的原则,你应该继续使用 getValue() 来获取值。如果你在 increased() 中也需要返回值,可以考虑返回一个布尔值来表示是否已达到限制并重置。

    这里是修改后的代码:

    // display.java
    public class Display {
        private int value;
        private int limit;
    
        public Display(int limit) {
            this.limit = limit;
        }
    
        public void increased() {
            value++;
            if (value == limit) {
                value = 0;
                return true; // 返回一个布尔值,表示是否重置
            }
            return false; // 没有重置
        }
    
        public int getValue() {
            return value;
        }
    }
    
    // clock.java
    public class Clock {
        private Display hour = new Display(24);
        private Display minute = new Display(60);
    
        public void start() {
            while (true) {
                minute.increased();
                if (minute.getValue() >= 60) {
                    minute.value = 0; // 直接修改内部状态,不推荐,仅作示例
                    hour.increased();
                }
                
                System.out.printf("%02d:%02d\n", hour.getValue(), minute.getValue());
            }
        }
    
        public static void main(String[] args) {
            Clock clock = new Clock();
            clock.start();
        }
    }
    

    这段代码中,我在 Display 类的 increased() 方法中添加了一个布尔返回值,用来标记是否达到了限制并进行了重置。然后在 Clock 类的 start() 方法中处理这个返回值,当分钟达到限制时,更新小时。注意,这里直接修改了 minute.value,这不是一个好的做法,应该通过调用 increased() 方法来保证封装性。不过,这里这么做是为了让你看到区别。在实际应用中,应遵循之前提到的最佳实践。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月19日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。