一个有趣的HelloWorld程序

相信广大程序员朋友们对Hello World程序一定不会陌生,也不知道谁这么有才,发明了这么经典的句子,以至于各种语言、技术都有相应的Hello World版本。

今天看到JavaEye上有人出了这样一道题,表面上看起来似乎不难,但是对于JAVA基础不好的人来说,还真是有点难度的。请看题目:

public class Test{

public static void main(String[] args){
try {

if(){
System.out.print("Hello ");
}else{
System.out.println("world!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

以上程序,在不新建类和方法的情况下,在if()里面加代码,使程序编译运行通过,输出Hello world!

如果给你5分钟时间,你能想出几个方案呢?

看到题后,首先分析if…else语句只能执行一个,如果要打印出Hello world!else语句块中就必须要执行,并且if()语句中还必须要有打印Hello的功能。所以在if()里添加代码时,需要符合两个条件:一是能够打印”Hello “,二是返回值为false。

综合考虑之后,就有了第一个解决方案:

...
if (System.out.printf("Hello")==null){
...


java中具有打印功能的语句并不多,能立马想到的就是System.out.print(“xxxx”)了,但是这个print()方法没有返回值,由此就想到了printf,它的返回值是PrintStream类型。

熟悉System用法的人应该还知道,不仅仅只有printf方法满足,还有append()和format()。

如果你不熟悉System的用法,那么是不是没有辄了呢。你应该会想到匿名内部类。虽然说题目要求不新建类和方法,但是匿名内部类比较特殊,应该说基本上满足要求把。那么就有了下面的解法:

...
if(new Object(){{System.out.print("Hello ");}}==null ){
...


如果你非常熟悉匿名内部类的话,这种解法自然是最简单不过了。

如果你对匿名内部类也不熟悉,怎么办呢?如果你熟悉反射的原理也行。下面就是利用java反射机制构造的一种解法:

...
if(System.out.getClass().getMethod("print",String.class).invoke(System.out, "Hello ")!=null){
...


网上大师们的解法还有很多,比如:
1.
if (args.length == 0 ? new Object() {
boolean f() {
HelloWorld.main(new String[2]);
return false;
}
}.f() : true) {
System.out.print("Hello");
} else {
System.out.print(" world!");
}

2.
if(args.length == 0 ? Test.class.getDeclaredMethod("main",args.getClass()).invoke(new Test(), new Object[]{new String[]{"a"}}) != null : true){
System.out.print("Hello ");
}else{
System.out.println("world!");
}

3.
public class Test{
public static void main(String[] args){
try {
if (new RuntimeException(){
boolean n(){
switch(getStackTrace().length){
case 3:
return false;
case 4:
return true;
default:
printStackTrace();
throw this;
}
}
public void printStackTrace(){
main(null);
};
}.n()) {
System.out.print("Hello ");
} else {
System.out.println("world!");
}
} catch(Exception e) {
e.printStackTrace();
}
}
}

如果你一点思路都没有,这里还有一个投机取巧的例子:

if(true)System.out.print(”Hello world!”); else if(false){
System.out.print(”Hello “);
}else{
System.out.println(”world!”);
}

以上代码类似于SQL注入,虽然方法并不正统,但也提供了一种思路。

到这里为止,已经介绍了不少方法了,虽然这些方法并非本人所创,而是大家集思广益所得,我只不过是负责搜集整理而已。但是在搜集整理的过程中,我发现一个现象,那就是当一个问题被一个人解决之后,其他类似的或者说更完善更高级的想法接踵而至,迅速地由点发射出无数根线,或许这就是传说中的发散思维吧!

好了,不多说了,该洗洗睡了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值