学Java也有段时间了,从Python切换到Java还是有些不适应,会很自然的对两者进行对比。Java是静态语言,相比动态语言,它有利有弊。亲近了机器语言,远离了人类语言。
利:更适合机器的语言,因为编译成了字节码,所以运行速度比动态语言快
弊:对人类来说,可读性远不如动态语言。语法太多,复杂。相对Python,语法复杂度增加了不止一倍
从机器语言到人类语言,中间就是编程语言,一个编程语言越接近机器语言,在机器上的执行速度越快,但可读性越差;反之,越接近人类语言,在机器上的执行速度越慢,但可读性越好。
世界上没有完美的东西,Java也不例外,从开发出来到现在,Java一直在完善自己。但还是有一些地方不尽如人意。
我十分喜欢Apple的产品设计理念:精简。但Java的设计,跟精简还有相当的距离。跟Python相比,差距也很明显。当然,这跟Java是编译型语言以及直接从C++进化过来有关系。
1. 不支持override静态字段和静态方法
override静态字段,我感觉这个需求非常常见。在父类中定义static字段和static方法,子类调用父类的static方法,但我不想使用父类static字段的默认值,而是想在子类中重新赋值,同时,又不想影响父类的static字段。但Java就是不支持,这点太坑了。
后来,我在Quora(连这个网站也墙,垃圾)上找到了答案:Why can't static methods be overridden? ,里面提到,实例方法的查找是运行时确定的,而类方法和类变量的查找是编译时确定的,所以不能override。像Smalltalk和Objective-C的类方法的查找是运行时确定的,可以override
2. 不伦不类的接口
接口其实是抽象类的简化。Java设计者不想用C++的多继承,所以用的单继承,但同时增加了接口概念去实现与多继承相同的功能。感觉Java设计者在当初增加接口概念时欠考虑,Java8又往接口里加default方法,搞的接口与抽象类之间只剩下一层内裤了:实例字段。既然这样,当初就不应该增加接口这个东西,因为每增加一个概念,都增加了复杂度。Java设计者显然不懂苹果公司的理念:精简。Python用的多继承,没啥不好。
3. 没有函数概念
Java8增加lambda,开始支持匿名函数。但是仍然不支持非匿名函数。如果用户想定义一个函数,只能用lambda或者用接口实现,还对这类接口美其名曰:函数接口。但其实是非常糟糕的设计,给函数套了个没用的套子。如果乔布斯在世,非痛骂这个设计者不可。
4. 初始化块
多余的设计,一点用都没有