今天中午,同学问我一个问题,题目很简单,但是我却折腾了一个中午。最后还是在谷歌的帮助下找到了答案,那个纠结啊,通过这个题目也可以看出自己在一些基础知识上的薄弱,贴出来,给大家看看,挺有意思的。
题目是这样的:(可以尝试先做一下再看下面的答案)
请把美貌和智慧赋给同一个女人
上天从不把美貌和智慧赋给同一个女人。下面有一段代码,请你在空处填写一段代码,
使之打印出:“我很美!我也很有才!”
public static void main(String[] args){
if(____________________________){
System.out.print("我很美! ");
}else{
System.out.println("我也很有才!");
} }
一看到题目,我第一的反应就是,你不是在坑我嘛,愚人节也过去了那么多天了,这个if-else语句我还是懂的啊,大一上学期的C语言就学过了,两个语句不可能同时执行啊,只要有一点点基础的人都知道,但是凭我对他的了解,他应该是认真的,所以我就想啊想,开始我的想法是用main方法中的String[] args,因为只有那个args可以操作啊,纠结了半个小时,也查了一些资料,最后还是放弃了,后面又想,既然if是条件判断语句,那应该就是在里面的条件那里做文章(这可是个热词)是否可以在条件里面就把前面if中的输出来,其实这个想法是正确的,但是由于其他的原因,还是没能得出正确的答案,此处略去一些东西,不说大家应该都懂,人艰不拆嘛,(∩_∩),就这样一个小时过去了,这个中午不能就这样费了啊,也没休息,下午的四节课是要跪的节奏啊,有时也是性格原因,要是找不出答案,哥哥下午的课就翘掉算了,既然自己搞不定,有时我们还是要有屈服的心理,放下我们的那一点所谓的臭架子,nin听一下别人的想法,我们又不吃亏,只要事先我们想过了就OK了,这种屈服是智者的屈服,我们的知识也有限,我们不懂可以学学别人嘛,看看别人是怎么做的,自己在这里死磕也没用,还把自己搞的心里烦躁。所以就百度了,开始也找不到,最后还是谷歌给力找到了类似的题目,一看答案真心觉得自己弱爆了,作者给出了六种解决的方法,可我一种方法都没想到,有的挨着边了,但是还是没写出来。
下面给大家看看这神奇的六种方法。我觉得挺神奇的。
上面的题目原题是这样的
问题如下:一个类HelloWorld,如下:
public class HelloWorld {
public static void main(String... a) {
if(你的代码) {
System.out.print("Hello,");
} else {
System.out.println("World");
}
}
}
该类含有main方法,如何执行该main方法,让它打印出Hello,World,前提是只准在if条件里,即在 你的代码 处添加代码。
经过搜集总结,可实现的方法如下:
(一)使用匿名内部类:
public class HelloWorld {
public static void main(String... a) {
if (new Object(){{System.out.print("Hello,");}} == null) {
System.out.print("Hello,");
} else {
System.out.println("World");
}
}
}
(二)利用PrintStream的append或format等方法(append处改为format)
public class HelloWorld {
public static void main(String... a) {
if (System.out.append("Hello,") == null) {
System.out.print("Hello,");
} else {
System.out.println("World");
}
}
}
(三)利用反射调用System.out.print
public class HelloWorld {
public static void main(String... a) throws Exception {
if (System.out.getClass().getMethod("print",String.class).invoke(System.out, "Hello,")!=null) {
System.out.print("Hello,");
} else {
System.out.println("World");
}
}
}
(四)利用反射调用main方法本身
public classHelloWorld{
public static void main(String... a) throws Exception {
if (a.length == 0 ? HelloWorld.class.getDeclaredMethod("main",a.getClass()).invoke(new Test(), new Object[]{new String[]{"a"}}) != null : true) {
System.out.print("Hello,");
}else {
System.out.println("World");
}
}
}
变体
public class HelloWorld {
public static void main(String... a) throws Exception {
if (a == null ? true : ((HelloWorld.class.getMethod("main", newString[1].getClass()).invoke(new HelloWorld(),new Object[1])) instanceof Void)) {
System.out.print("Hello,");
}else {
System.out.println("World");
}
}
}
(五)利用jdk1.6的动态脚本
import javax.script.ScriptEngineManager;
public class HelloWorld {
public static void main(String... a) throws Exception {
if (new ScriptEngineManager().getEngineByName("JavaScript").eval("print ('Hello,');")!=null) {
System.out.print("Hello,");
} else {
System.out.println("World");
}
}
}
(六)利用jdk1.5的printf方法
public class HelloWorld {
public static void main(String... a) throws Exception {
if (System.out.printf("Hello,") == null) {
System.out.print("Hello,");
} else {
System.out.println("World");
}
}
}
看完这六个方法,你想到了几个,有些我们也许真的想不到,我能想到的也就只有第一个那样的形式的了,但是还是没有写出来,自己的基础知识真的太差了,还要加强。