Java基础-Java数据类型
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.数据类型的作用
数据类型就是一组值,以及这一组值上的操作,数据类型可以决定数据的存储方式,取值范围,允许的操作。
二.数据类型的分类
Java中的数据分为基本类型与引用类型两大类:
1>.变量名所标识的存储空间和存储的内容就是变量的值,这是基本类型。
2>.变量名所标识的存储空间中存储的内容是另外一块存储空间的起始地址(引用),这是引用数据类型。
java中的基本类型又分为:整数类型,小数类型,字符类型,布尔类型。Java中引用类型又分为:类,接口,数组等。
三.基本数据
1>.整数类型
数据类型 |
所占字节数 |
取值范围 |
byte |
1 |
-128~127 |
short |
2 |
-32768~32767 |
int |
4 |
-2147483648~2147483647 |
long |
8 |
-263~263-1 |
a>.对于一个字节来说,用二进制表示它的取值范围:
1000 0000 (-128)
0111 1111 (127)
b>.对于四个字节int类型,用二进制表示取值范围
1000 0000 0000 0000 0000 0000 0000 0000 (-2147483648)
0111 1111 1111 1111 1111 1111 1111 1111 (2147483647)
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ public class IntDemo{
public static void main(String[] args){
//1>.整数字面量默认为int类型,我们这里定义一个int类型的变量。
int a = 100; //2>.定义一个byte类型的变量。
byte b = 20;
/**
给byte类型变量赋值时,如果这个整数字面量在byte类型的取值范围
之类可以赋值,如果给byte类型变量赋值的整数字面量超过了byte的取值
范围,则不可以赋值。 */
// b = 200; //"错误: 不兼容的类型: 从int转换到byte可能会有损失"。 //3>.byte/short/char这三种数据类型在进行运算之前,会先把字节提升为int再运算
System.out.println(b); // b = b + 1; //错误: 不兼容的类型: 从int转换到byte可能会有损失
/**
上面的“b = b + 1”想把b变量的值加上1之后,把和21再赋值给b变量。
在b变量加1之前,系统会自动把b提升为int类型再加1,b+1这个表达式为
int类型,不能直接赋值给byte类型变量。
*/ // b = a; //错误: 不兼容的类型: 从int转换到byte可能会有损失
/**
编译器在进行语法检查时,不管a变量的值是多少,编译器也看不到变量
的值是多少,编译器只认识a是int类型的变量,不能直接赋值给byte类型变量。
*/ b = 100 + 20;
System.out.println(b); //4>.short类型变量赋值也要在short的取值范围之内
short c = 456;
// c = c + 1; //错误: 不兼容的类型: 从int转换到short可能会有损失.
c += 1; //其实这里系统做了一个隐藏的操作:c = (short)c + 1;和上面的还是有一定区别的。
System.out.println(c); //5>.long类型变量
long d = 123;
/**
整数字面量123是int类型,变量d是long类型,在把整数字面量赋值给long类型时隐含着一个
自动类型装换,就是把int类型的字面量转换为long类型。建议在给long类型变量赋值时,在整数
字面量后面加上字符L(l)表示这个整数就是L类型。
*/ // d = 4147483647231; //错误: 过大的整数: 4147483647231.原因是这个字面量已经超过了int类型能保存的最大数值。
d = 4147483647231L; //省去了自动转换这一步。我们在后面加上L即可解决问题。
System.out.println(d); }
}
2>.小数类型
数据类型 |
所占字节数 |
精度 |
Float |
4 |
7 |
Double |
8 |
15 |
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ public class DecimalDome{
public static void main(String[] args){
//1>.小数字面量默认是double类型,定义一个double类型变量。
double a = 3.14; //2>.定义一个float类型变量,需要在小数后面加一个字符F(f)。
float b = 4.56F; //3>.float类型精度有7位
b = 456789.456789f;
System.out.println(b); //4>.小数在计算机中采用近似值保存,不准确。
b = 456789.987F;
System.out.println(b); System.out.println(2 - 1.1);
/**
一般情况下,小数不直接判断是否与另外一个小数相等,如果两个
小数相减,他们的差小于某个值是就认为这两个小数相等。
*/
}
}
3>.字符类型
char,占2个字节,采用Unicode编码。
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ public class CharDemo{
public static void main(String[] args){
//1>.定义一个字符类型的变量
char s1 = 'A'; //2>.字符类型采用Unicode编码(utf-16格式),每个字符占两个字节,存储汉字
s1 = '尹';
System.out.println(s1); //3>.字符类型实际上存储的是这个字符对应的码值。
/*
s1 = 'A'
在s1变量中实际存储的是字符‘A’的码值是65
常见的码值有:
a>.‘A’: 65
b>.‘a’: 97
c>.‘0’: 48
d>.‘回车’ 13
e>.‘换行’ 10 */ //4>.因为字符存储的是码值,直接把一个整数赋值给字符类型变量。这个整数应该在0~65535之间,因为码值不存在负值。
s1 = 97;
System.out.println(s1); s1 = 'Y';
System.out.println(s1 + 1);
/**
上面一行是把 s1 + 1 这个表达式的值打印到屏幕上
先把s1变量的值89取出来,加上1的和90,打印到屏幕上
*/ //5>.char、byte、short在进行算术运算之前,先把自己提升为int类型。
// s1 = s1 + 1; //错误: 不兼容的类型: 从int转换到char可能会有损失 /**
6>.转移字符:
a>. \t tab,跳到下一个制表位,不是产生8个空格。
b>. \n 换行
c>. \\ \
d>. \' ’
e>. \" "
*/
System.out.println("abcdefg");
System.out.println("\"abcdefg\"");
//在Java中,遇到“\”就会默认为是转义字符的开始。
// System.out.println("abc\defg"); //这里的\d是:“错误: 非法转义符” }
}
4>.布尔类型
boolean,占1个字节,只有true和flase两个值。
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ public class BoolDemo{
public static void main(String[] args){
boolean flag = true; System.out.println(flag); //boolean类型只有true/false;
// flag = 0; //错误: 不兼容的类型: int无法转换为boolean. System.out.println(flag);
}
}
四.基本类型转换
1>.基本数据类型转换
布尔类型不能和其它类型进行转换,整数,小数,字符类型可以相互转换。
2>.自动类型转换
3>.强制类型转换
不能进行自动类型转换时就可以进行强类型转换。格式:(目标类型)(表达式) 。
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ public class AutoDome{
public static void main(String[] args){
//1>.自动类型转换
byte bb = 10; short ss = bb; int ii = ss;
ii = bb; long gg = ii;
gg = ss;
gg = bb; float ff = gg;
ff = ii;
ff = ss;
ff = bb; double dd = ff;
dd = gg; //2>.自动类型转换也可能丢失精度
ii = 2147456321;
ff = ii; //int可以自动转换float类型。
System.out.println(ff); //2.14745638E9 //3>.强制类型转换-小数转换为整数,舍弃小数部分
dd = 3.789123;
ii = (int)dd; //把double类型强制转换为int类型。
System.out.println(ii); //4>.强制类型转换-大的整数类型转换为小的之整数类型
ii = 270;
bb = (byte)ii;
System.out.println(bb);
/**
ii变量在计算机中的存储形式:
0000 0000 0000 0000 0000 0001 0000 1110
把ii强制转换为byte类型型,只把最后一个字节的数存储到bb变量中,bb变量中存储的内容为:
0000 1110
*/ //5>.强制类型转换-整数可以转字符
ii = 110;
char cc = (char)ii;
System.out.println(cc); //6>.强制类型转换-可以对表达式进行强制类型转换
bb = 123;
bb = (byte)(bb +1);
System.out.println(bb); }
}
五.基本数据类型与引用数据类型的区别
在Java中,基础数据类型的定义很简单,如:“int a = 18;”虽然就一行,其实是做了2步操作,第一,就是在内存中开辟了一块单独的内存空间,而这个变量对应的字面量就是这个内存空间所存储的值。也就是是说,当你修改“a”变量时,内存空间(或者说内存地址)并不发生改变,只是修改了内存变量所对应的字面量的值。
定义引用类型的变量也很简单,如:“String s = "hello world";”,从定义的格式上来看,跟基础数据类型定义方式如出一辙。但是在存储数据的时候却又很大的差异,引用数据类型定义之后,会在栈中存储一个内存地址,这个内存地址会对应到具体字面量的值。我们可以通过下面的图来记忆一下: