《Java架构筑基》从Java基础讲起——基本数据类型

1. 基本类型有哪些

Java定义了八种基本数据类型:byte,short,int,long,char,float,double,boolean。java

  • 基本数据类型也称为简单类型,这些类型能够分为四组:
    • 整型。包括byte,short,int,long。用于表示有符号整数。
    • 浮点型。包括float,double。用于表示带小数位的数字。
    • 字符型。包括char。用于表示字符集中的符号。
    • 布尔型。包括boolean。用于表示true/false值。
  • 开发者能够直接使用这些类型,也可使用它们来构造数组以及自定义类型。所以,它们造成了全部能够建立的其余类型的基础。Java在其余方面是彻底面向对象的,但基本数据类型并非面向对象的,这样设计的缘由是为了效率。将基本数据类型设计为对象会极大地下降性能。
  • 由于Java语言的特点其中一个就是具有可移植性,即无论在哪一个平台下运行,一份代码无需修改就能够直接运行。为了确保这一点,基本数据类型被定义为具备明确的范围和数学行为,与C和C++这类语言“容许整数的大小随着执行环境的要求而变化”不一样,Java语言的数据类型都具备严格定义的范围。不管在那种平台下,int老是32位的。虽然严格指定基本数据类型的范围在某些环境下会形成性能损失,但这是为了实现可移植性而必须付出的。

Java的八种基本类型说明以下所示,其中每一种都有特定的格式和大小 |基本类型|说明|字节数 |:----:|:----:|:----: |byte|字节长度的整数,八位|1个字节 |short|短整数,十六位|2个字节 |int|整数,三十二位|4个字节 |long|长整数,六十四位|8个字节 |float|单精度浮点数,三十二位|4个字节 |double|双精度浮点数,六十四位|8个字节 |char|Unicode字符|2个字节 |boolean|布尔值|1个字节程序员

2. 字面值有哪些类型

基本类型的字面值有四种子类型:整数字面值,浮点数字面值,字符字面值,布尔字面值数组

3. 整型数据介绍

3.1 整型数据

Java定义了四种整数类型:byte,short,int,long。全部这些类型都是有符号的、正的整数或者负的整数。Java不支持无符号(正值)的整数。博客 名称|宽度|范围 :--:|:--:|:--:| long|64|-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 int|32|-2 147 483 648 ~ 2 147 483 647 short|16|-32 768 ~ 32767 byte|8|-128 ~ 127ide

当中,最经常使用的整数类型是int。函数

  • int类型常常用于控制循环变量和索引数组。对于那些不须要更大范围的int类型数值的状况,你可能会认为使用范围更小的byte和short类型效率会更高,然而事实并不是如此。由于在表达式中使用byte和short值时,当对表达式求值时它们会被提高为int类型。因此,当须要使用整数时,int一般是最好的选择。

3.2 整数字面值

整数字面值能够写为十进制,十六进制(加前缀0x或0X),八进制(加前缀0),二进制(加前缀0B或0b)性能

//十进制
int x=10;
//十六进制数,即十进制的32
int y=0x20;
//八进制,即十进制的15
int z=017;
//二进制,即十进制的7
int u=0b0111;

整数字面值用于将值赋给byte,short,int和long类型的变量。所赋值不能超出变量的存储范围设计

  • 例如,如下代码在IDE中就会提示错误,由于byte的最大值为127
byte b = 250;
  • 要将一个值赋给long类型时,在数字的后面要加上后缀字母L或l。不然,以下代码中的整数值实际上是被看作是int类型的
long a = 120;
  • 在如下代码中,就会产生一个错误,由于99999999999超出了int类型的存储能力。为了解决这个问题,须要在数字后加上后缀字母L或l
long a = 99999999999;

若是整数字面值太长,可读性会受到影响。code

  • 从Java 7开始,可用在整数字面值中使用下划线将数字分隔开。
//十进制
int x=1_000_000;
//十六进制数,即十进制的32
int y=0x2_0;
//八进制,即十进制的15
int z=0_17;
//二进制,即十进制的7
int u=0b0_111;

4. 浮点型介绍

4.1 浮点型数据

浮点数也称为实数,当计算须要小数精度的表达式时使用。 名称|宽度|范围 :--:|:--:|:--:| float|32|1.4e-045 ~ 3.4e+038 double|64|4.9e-324 ~ 1.8e+308对象

float索引

  • float类型表示使用32位存储的单精度数值。在某些处理器上,单精度运行速度更快,而且占用的空间是双精度的一半,可是当数值很是大或者很是小时会变得不精确。若是须要小数部分,且精确度要求不高时,就能够考虑使用float类型。

double

  • double类型表示使用64位存储的双精度数值。在sin()、cos()和sqrt()这类数学函数中,返回值都是double类型。若是须要在不少次迭代运算中保持精度,或是操做很是大的数值时,double类型是最佳选择。

4.2 浮点数字面值

浮点数包含如下四个部分

  • 一个整数部分
  • 一个小数点
  • 一个小数部分
  • 一个可选的指数

例如,在1.7e8中,1是整数部分,7是小数部分,8是指数

  • 在float和double类型中,0的整数部分是可选的
  • 例如,0.5能够写成.5
  • 浮点数字面值加上的后缀字母F或f代表其为float类型,若是没有标明,该浮点数字面值将是double类型

5. 字符介绍

5.1 字符型数据

char是用于存储字符的数据类型。Java的设计初衷是容许程序员编写在世界范围内都可使用的语言,所以采用了Unicode标准来表示字符。Unicode定义了一个彻底国际化的字符集,可以表示所有人类语言中的全部字符,为此须要使用十六位宽度来存储。char的范围是0 ~ 65536,没有负的char值。

对于一些语种,例如英语、德语等,可使用八位宽度来表示这类语言的字符,使用Unicode在必定程度上会下降效率,但这是为了在全球得到可移植性而必须付出的代价。

尽管char被设计为容纳Unicod字符,但也能够用做整数类型,能够对char类型的变量执行算术运算。

5.2 字符字面值

字符字面值是一个Unicode字符,或者是单引号括起来的一个转义序列

例如

'a'
'b'
'\b' 回退字符
'\n' 换行
'\r' 回车

6. 布尔字面值

布尔类型有两个值,分别为true和false。

例如,声明一个布尔变量bool

boolean bool=true;

7. 基本类型转换

在涉及处理不一样数据类型时,经常须要将一个变量的值赋给另外一个变量,这就须要进行类型转换

默认转换

  • byte,short,char—int—long—float—double
  • byte,short,char相互之间补转换,他们参与运算首先转换为int类型

强制转换

  • 格式: 目标类型 变量名 = (目标类型)值或变量名
  • int a = (int) 15.7f;

注意要点

!!!!!!!注意!!!!!!!!
1:在java中,任何一个整数默认为 int 类型 (1)
2:在java种,任何一个小数,默认为 double 类型( 1.0)
3:123L 或者 1231 编译器会将该数当成long类型
4:12.345f 或者12.345F 编译器会将该数当成float类型

7.1 加宽转换

当从一种基本类型转换向另外一种基本类型时,若是后者的大小和前者相同或者更大,就叫作加宽转换

  • 例如,将int(32位)转为long(64位)。此时不会有信息丢失的风险,且加宽转换是隐式发生的,不须要在代码中任何事情
  • 例如
int a=10;
long b=a;

7.2 收窄转换

收窄转换发生在从一种基本类型转换为另外一种更小类型的转换中

  • 例如,从long(64位)到int(32位)。收窄转换须要显示调用,用圆括号指定目标类型
long a=10;
int b=(int)a;
  • 若是被转换的值比目标类型的容量还要大的话,收窄转换将致使信息丢失
  • 例如,9876543210对int类型来讲太大了
long a=9876543210L;
int b=(int)a;
//输出值是1286608618
System.out.println(b);

8. 表达式中的自动类型提高

除了赋值外,在表达式中也可能会发生类型转换。在表达式中,中间值要求的精度有时会超出操做数的范围。博客

例如:

byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;

中间部分 a b 很容易超出byte操做数的范围。为了解决这类问题,当对表达式求值时,Java会自动将每一个byte,short或char操做数提高为int类型。这意味着使用int类型而不是byte类型执行子表达式a b。所以,即时a和b都被指定为byte类型,中间表达式(50 * 40)的结果2000是合法的。

自动类型提高颇有用,但有时候会致使难以理解的编译时错误。例如:

byte b=10;
//错误
b= b*2;

如上代码试图将 10 * 2 的结果(一个彻底有效的byte值)保存到byte变量中,可是编译器却提示错误。当计算表达式的值时,操做数被自动提高为int类型,因此结果也被提高为int类型。所以,如今是试图将一个int类型值转为byte变量,若是不使用强制类型转换,就不能将结果赋给byte变量。

Java定义了几个应用于表达式的类型提高规则

  • 对于一元操做符来讲,若是操做数的类型是byte,short或char,运算结果提高为int类型
  • 对与二元操做符来讲,提高规则是从如下几条依次选择一条执行
  • 若是操做数类型均为byte、short或char,那么两个数均转为int类型,结果数也将为int类型
  • 若是操做数包含double类型,那么另外一个操做数也转为double,结果数也将为double类型
  • 若是操做数包含float类型,那么另外一个操做数也转为float,结果数也将为float类型
  • 若是操做数包含long类型,那么另外一个操做数也转为long,结果数也将为long类型
相关文章
相关标签/搜索