java的大小端已经被完全隐藏了,java也不允许依赖于大小端的代码

来源:互联网 发布:网络打印机图标灰色 编辑:程序博客网 时间:2024/05/29 09:26

类型大小

 

c和c++的类型体系里,存在一个很大的隐患,类型大小没有明确的定义,由实现确定,比如对于long类型只是保证至少32位。一方面这样的设计有利于效率的提高,可以根据实际情况选择最适合的大小,比如实际机器字的长度。但是另一方面则带来了可移植性的问题,因为一个int在不同的地方可能就是不同的范围,这就可能引起问题。而java呢,可移植性是其重要的设计目标,它对的类型大小都在语言的层面进行了规定,也就不存在一个int一会是16位,一会是32位的问题,这样就可以提供更好的移植性。这个性质带来了另一个额外的影响,java取消了sizeof运算符,这个运算符是在c,c++中用来得到类型大小的,而由于java对基本类型大小进行了严格限定,另一方面它的class对象又都是引用,所以它的存在也就没有意义了。另外对于运算符方面,java提供了一些新的运算符扩展,比如移位,c++对于有符号数的右移没有明确的定义,java则提供了>>和>>>进行明确的区分,移位的可移植性由此获得。

 

类型的选择

 

另外java没有结构体,union。原因就是class可以替代struct的功能。而union,是内存吃紧的产物吧,同时行为类似于c++的reinterpret_cast,这也是最不安全的类型转换,没有了它程序依然可以实现。可能会有一个问题,以前c/c++里都是用union来判断大小端的,那java如何判断大小端呢?怎么回答呢,大概是这样的,java的大小端已经被完全隐藏了,java也不允许依赖于大小端的代码。当然如果你真的想判断,好吧有个方法:调用本地方法。

 

Java由于没有运算符重载,这样对于==,确定了其意义也就是比较地址。这样就意味着对于对象,==,只能用来判断对象地址,如果要判断对象内容必须重载equals函数,而==的意思是无法再被改变的。

 

同时另一个重要的选择,java抛弃了指针,这个也是c最强大的武器之一。反映了安全性与效率之间的选择,c++选择了效率和兼容性,但是java选择了安全。同时这也是很多程序员对java诟病的原因之一,因为指针是一个伟大的概念,它的缺失可能引起一代程序员概念的缺失。的确指针更接近计算机的底层,java将它封装起来,让程序员远离了指针的泥潭,同时远离了对底层的理解。

 

类型转换

 

c++的类型转换,尤其是隐式转换,随处可见,但是类型转换一般被视为设计缺陷的标志。尤其是隐式的转换往往在排除错误的时候变得异常艰难。好的语言设计,应该是让错误尽早显示,不是隐藏错误。虽然作为人来说,本性更喜欢隐藏错误,当然坦白承认错误的品性才是值得肯定的。c++对c的类型转换体制进行了修补,提出了新的类型转换机制,***_cast系列,当然同样是兼容性的问题,新旧转换机制的混合使得c++的类型转换显得更加复杂,如何有效利用c++的新机制呢,结果就是需要程序员规范类型转换,自觉的使用新的类型转换取代老的机制。

 

java的类型转换则进行了更严格的规定,首先boolean类型无法转换为其他类型,也就是boolean类型只能用在条件判断里,不要想把它用在整数运算里,这更符合boolean的自然语义。基本类型在其他方面与c++的差别不大。对于class类型,c++中允许通过隐式调用构造函数实现类型转换,但是这一支持有时候很让人惊奇,所以我更支持java的做法,至少能让我们更了解自己写的程序。java并不允许这样的转换,class的自动转换大概只有toString()一个,在需要字符串的时候,会自动调用类的这个函数。

 

原创粉丝点击