数据类型是一门语言的血肉,通过这5分钟的浏览,只学过C/C++的小伙伴会初步了解Java的一些特性,学过一点Java的朋友在读完这篇文章后也一定会对Java的语法规范有更深刻的了解
Java数据类型分为两大类,一类为基本数据类型,包含了int、char等八种数据类型,另一类为引用数据类型(该类型我们暂且不讨论)
首先先让我们看看Java的八种数据类型有哪些:
想必大家都知道C/C++的数据类型大小在不同机器、不同编译器上都会有些许的差异,例如在32位电脑上和64位电脑上long的大小就不同,这就导致同样的代码在64位上可以正常运行,但放到32位计算机上就可能会出现溢出等情况。
但Java完全不会有这种顾虑,无论是32位还是64位,所有数据类型大小都是相同的,这就大大减轻了程序员移植代码的难度。
在学过C和C++之后再来学Java,我很明显感觉到Java是一门很“矫情”的语言
如果在程序员面前C/C++是
那在程序员面前Java就是。。
想必C/C++的小伙伴都见过这样的代码
#include<iostream> #include<cstdio> using namespace std; int main() { int i = -10; unsigned int ui = 10; if (ui > i) cout << "yes" << endl;//printf("yes "); else cout << "no" << endl;//printf("no "); }
结果为no,道理应该大家都知道,这是因为在(ui>i)时,i被隐式转化为了unsigned类型,由补码反码的知识我们知道-10用unsigned表示是4294967286,道理很简单。但是在项目中你很可能因为一个走神写下了这样的错误,导致程序能正常编译,运行结果却和预料的结果大相径庭(大家应该都有花半个小时甚至一个上午找这种“小”BUG的经历吧。。)
但在Java中,无符号类型直接被砍掉了,没错这样直接根除无符号类型的BUG。。
其实我觉得在这里我很支持Java,因为unsigned存在的价值本身就不大,与signed只是一个二倍的关系。范围没大多少,但使用错误的后果却是极大的,除了上面的代码之外还有下面这种常见无符号BUG:
unsigned int ui=1; cout<<ui-2<<endl;
最后的输出就是一个很大的数。
除此以外,Java对变量的常数赋值也做了很多限制,例如:
#include<iostream> #include<cstdio> using namespace std; int main() { char c = 888888; cout << c << endl; }
在C/C++这串代码就能正常运行,C/C++编译器默认你知道数字会溢出,知道数据会被截断,因此并没有报错,最多是给你一些警告。
但在Java中这样写。。
是的,直接无法编译,因为byte最大值为127,130已经超过了byte的范围。
除此以外Java中还不允许出现把表示大范围的数赋值给小范围数的情况,如下:
与C/C++顺从不同,直接硬上Java是不愿意的,那么如何让Java乖乖听话呢,那当然是用一些工具胁迫他啦,嘿嘿嘿。。。
没错,就是显示类型转化!(要不然还能是什么?)
public class Test { public static void main(String[] args) { int a=1; byte b=(byte)a; System.out.println(b); } }
一个数据能否赋值取决于该类型的表示范围,而不是内存大小,把short类型的数据给char(在Java中char为两个字节)也是不行的!!!因为short可以表示负数,而char不可以!
到了这里你应该已经理解了Java的健壮性是如何而来的了。
那么这里我再给大家看看一些有趣的代码(Java程序员看过来!)
public class Test { public static void main(String[] args) { byte a=1; byte b=2; byte c=a+b; System.out.println(c); } }
答案理所应当输出3对吧!
但很可惜并不是,因为这段代码根本不能成功编译。。。
原因就在于在进行该运算时,byte发生了整型提升(不知道整型提升的可以在搜一下相关博客)
因此在这里c接收到的其实是一个int大小的数据,大范围不能给小范围变量赋值,所以报错了。
在Java中,每一个基本数据类型都有一个包装类,如下图
在包装类中封装了对该类型的一些常用操作,以int为例
public class Test { public static void main(String[] args) { int a=1; int b=2; System.out.println(Integer.MAX_VALUE);//获取整型最大值2147483647 System.out.println(Integer.max(a,b));//a和b的max 2 System.out.println(Integer.reverse(a));//翻转数字,输出-2147483648