Java 一次性执行 if 和 else 的代码块
总所周知,在普通的 if-else 结构中,if 和 else 分支是互斥的,只会执行其中一个分支。那么如果我们希望 if 和 else 里的代码块同时执行呢?(这确定不是闲的吗??)
需求
1 | /** |
解决
嘶…这个需求?删掉 if 和 else 留下各自的代码块不就好了,开码!!!
1 | /** |
需求完美被解决,本文完(bushi)。
咳咳~ 不开玩笑了,接下来开始真正解决这个需求
1 | /** |
这一堆乱七八糟的什么东西啊
我们直接来看执行结果:
完美实现需求(这次是真的),那么他是如何实现这个需求的呢?
原理解释
仔细观察源代码,我们可以发现使用到了一个匿名类、初始化块以及递归调用。怎么样,是不是想到了什么?其实原理很简单,巧妙地利用了实例初始化代码块的执行优先级和递归调用自身来实现我们的需求。
我们再来仔细看一下源代码,从源代码执行开始逐句分析
1 | /** |
在程序进入
main
方法后,首先遇到if
语句,开始对条件进行判断。我们知道,在不传值时,
args
默认为[]
,并不等于null
。所以左条件不成立,此时进入右判断分支。在右条件中创建了一个匿名类的实例,使用了实例初始化块递归调用了自身的
main
方法并给args
赋了一个null
值。接下来进入被调用的
main
方法中,此刻的args
已被赋了一个null
值,固if
的左判断条件成立。根据短路或
的执行规则,右判断不会被执行,所以不会再继续往下递归调用自身。而因为递归方法中if
分支的左条件为 成立,输出 “youfeng”。递归方法的main
方法到此执行完毕,回到递归上层。此刻的匿名类实例已执行完毕,而匿名类的实例放在此处为字符串,并不能作为一个布尔值来进行逻辑运算,所以引入与字符串 “侑枫” 对比。
字符串 “侑枫” 的引用地址与匿名类的引用地址不同,比较结果为
false
。而在开始进入 main 方法时,已经判断args
为[]
,不等于null
,左右条件皆为false
。因此if
分支的判断结果为false
,输出 “有风来”,程序执行完毕。
需求实现,该需求更多的还是考验对 Java 基础的理解和逻辑能力的变通。当然,如果不限定在 if()
中填入条件,而可以在其他地方填入,这个需求则会更加简单:
1 | /** |
甚至如果不限定在 在 main 方法中的 if()
中填入,我们将方法体封装为一个方法:
1 | public static void main(String[] args) { |
不过既然选择了判断语句的if-else 又要求两分支全部都执行,提出这个需求的人点没猫饼吧?哈哈哈哈哈哈哈哈哈哈
看到这里的小伙伴再回到最开始的需求,是不是感觉豁然开朗了许多呢?
最后附上本文所写源代码:if-else分支同时输出
- 标题: Java 一次性执行 if 和 else 的代码块
- 作者: HYF
- 创建于 : 2023-08-21 19:36:32
- 更新于 : 2024-07-27 21:21:51
- 链接: https://youfeng.ink/if-else OutPut-a477ab791ce2/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。