这个世界除了 java 以外,还有种东西叫常识。
比如 php:
> $a = md5('hello'); print $a == 5 ? 'yes' : 'no';
< yes
因为 md5('hello') 的结果是 '5d41402abc4b2a76b9719d911017c592',而 == 运算符在比较字符串和数字时,会把字符串自动转成数字再进行比较
再比如 js:
> [10, 2, 1].sort()
< [1, 10, 2]
因为 js 里 Array.prototype.sort 默认会把元素按照转换成字符串做比较
系统设计方面有个概念,叫做最小惊讶原则。php、js 很多所谓烂的地方就在于,太让人惊讶了,上面两个就是例子。同理,看到 three = 3 之后,按照常识来说,three 的结果就应该是 3。如果不是的话,按照同样的道理,这个设计就跟 php、js 这俩反常识的设计一样烂。
c/c++ 有很多 undefined behavior,implementation-defined behavior,最经典的 ub 就是同一个表达式里多次自增,比如 ++a + ++a。这些都是非常失败的设计,这也是为啥上世纪90年代的 c-like 语言里,如果支持 ++/-- 表达式的话,都规定了多次出现的计算顺序,比如 java。那么我有个问题,你们公司的 java 代码,会允许 foo = ++i + i++ 这种表达式的存在吗?同理,你在每次使用 this.three 时,都会考虑是不是从 constructor 里面调用目前这个方法的问题吗?不要不承认,这个东西就跟 ub 一样是个坑,完全就是设计烂的表现之一。这就跟 js 为啥要抄 java.util.Date 一样,你一个带 gc 的语言,又不支持多继承,为啥非要抄 c++ 的实现?
【 在 RuralHunter 的大作中提到: 】
: 你这就是强词夺理了,理解了java构造函数和类属性初始化顺序根本不会觉得有什么问题,因为这个顺序完全合乎逻辑没有任何奇怪之处。
: 你是觉得子类的变量初始化应该早于父类构造函数还是觉得父类中调用被重载的方法不应该执行子类的方法?
: #发自zSMTH@Fish Boat
: ...................
--
修改:eGust FROM 203.211.108.*
FROM 203.211.108.*