一,重复的类型申明 
User user=new User(); 
说明:Java是静态语言,为了这一点,声明变量的时候必须明确告诉编译器该变量的类型。Java编译器就不能智能点吗? 
 二,临时变量 
 
int total=0; 
 for(int i=0;i<10;i++) 
 { 
 total+=i; 
 } 
说明:total和i变量,造成局部代码臃肿,代码有更多的状态,多线程控制非常困难。 
 三,static对面向对象的冲击 
 
public class Person { 
 public static int total=0; 
 } 
说明:static把不属于对象模板的东西硬生生的塞进去,使得模板不伦不类。 
 四,不支持高阶函数和闭包 
 
public void loan(operate) 
 { 
 BufferedReader in = null; 
 try{ 
 in=new BufferedReader(new FileReader(filename)); 
 operate 
 }catch(Exception e) 
 { 
 e.printStackTrace(); 
 }finally{ 
 in.close(); 
 } 
 } 
说明:不能以函数作为参数,使得Java处理上面类似的需求时,最优雅的实现就是:先申明一个接口,写多个类实现这个接口中的方法,然后把这个接口作为这个函数的参数。结果便是,类的数量迅速增加,类也变成了只是一个方法的包装器! 
五,switch只支持int和enum类型 
 
switch(name){//java不支持这样写 
 case "zhangshan":... 
 case "lisi":... 
 case "wangwu":... 
 default:... 
 } 
说明:相信有很多Java程序员质疑,Java的switch为什么只支持int和enum类型? 
 六,synchronized泛滥 
public synchronized void getResouce() 
 { 
 ... 
} 
说明:Java编程中最难的要数多线程编程,synchronized是很多程序员迈不过的槛! 
 七,转义之痛 
 
String path="c:\\test\\test.java"; 
String content="hello ,\"Mr Right\"";
说明:转义,让优秀的程序员也不得不从流畅的编程中停下来,为编译器的无能做低级劳动。 
 八,运算符重载 
 
public class Complex { 
 private int real; 
 private int imaginary; 
 +(Complex complex){ 
 return new Complex(real+complex.real, 
 imaginary+complex.imaginary); 
 } 
} 
说明:运算符重载,多么优美的风景线,Java却无情的拉上了封条。 
 九,繁琐的多重循环 
 
for(int i=0;i<n;i++) 
 { 
 for(int j=0;j<m;j++) 
 { 
 ... 
 } 
} 
说明:大家也许已经习惯了多重循环,但我们为什么要习惯这种笨拙的实现? 
 十,多余的字符 
 
public String getName() 
{ 
 return this.name; 
}
说明:()必须吗?String必须吗?return必须吗?.必须吗?;必须吗?
                










