数据类型
- 数据类型决定了变量占据多大的内存
- 强类型语言: 要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
- 弱类型语言: 与强类型语言相反
两大数据类型
基本数据类型(primitive type)
-
数值类型
-
整数类型(整数默认是int型的)
-
byte(字节型) 占1个字节
- 范围:-128~127 (-27~27-1)
- byte的范围为什么是-128~127 ?
-
short(短整型) 占2个字节
- 范围:-32768~32767( -215 ~ 215-1 )
-
int(整型) 占4个字节 默认值为0
- 范围:-2147483648~2147483647 ( -231 ~ 231-1 )
-
long(长整型) 占8个字节
- 范围:-263 ~ 263-1
-
-
浮点类型(小数默认是double型的)
- float(单精度浮点型) 占4个字节,有7~8位有效数字
- double(双精度浮点型) 占8个字节,有15~16位有效数字
-
char(字符类型) :占2个字节
-
范围:-32768~32767( -215 ~ 215-1 )
-
默认值:’u0000‘
-
每个字符都有其编码(数值)
-
编码:ASCII ISO8859-1 GBK UTF-8(3个字节)
-
-
-
boolean(布尔型):占一位,其值只有true和false两个 默认值为false
public class Demo{
public static void main(String[] args){
//八大基本数据类型:
//整数
int num1 = 10;
byte num2 = 20;
short num3 = 30;
long num4 = 40;
//小数:浮点数
float num5 = 50.1f;//小数默认是double型的,需要在小数结尾加‘f'
double num6 = 3.141592653589793238462643;
//字符
char name = '中';
char c2=65;//因为编码,输出为a
int num='a';//输出为65
/*字符串:String不是关键字,是类
String nameA = "Shania";*/
//布尔值:是非
boolean flag1 = true;
boolean flag2 = false;
}
}
引用类型(reference type)
- 类
- 接口
- 数组
对比
-
基本数据类型的变量:
1.存储的是数据本身
2.作为参数,传递的是数值 -
引用数据类型的变量:
1.存储的是在堆中开辟内存的数据的首地址
2.作为参数传递的是数值(地址值)
数据类型转换
-
由于Java是强类型语言,所以要进行混合运算的时候,需要用到类型转换。
由低到高:
byte, short, char < int < long < float < double
浮点数数值范围比整数的数值范围大
-
运算中,不同类型的数据先转化为同一类型,然后进行运算。
-
字符串和任何类型的数据相连接都被转为字符串
// +号:数值相加or字符串连接 int a = 66; int b = 5; System.out.println("hehe" + a + b);//hehe665 System.out.println(a + b + "ok");//71ok
强制数据类型转换
-
(类型)变量名
-
高→低
byte x=66; // 默认是int类型,没有溢出,内部自动进行从高到低的类型转换 00000000 00000000 00000000 01000010=====>去掉前三个字节01000010
byte y=200; // 内存溢出
byte y=(byte)200; // 强制类型转换 去掉前三个字节为11001000,高位为1是负数,按位取反00110111,再加一,为00111000, 输出结果为y=-56
byte b = (byte)128; // 内存溢出,需要强制类型转换 输出结果为b=-128
byte a = 127;
a = a + 10; // a+10 10为整型,a自动类型转换为整型,相加后赋值给byte型的a,报错,需要强制类型转换
a=(byte)(a + 10); // 输出结果为a=-119
自动数据类型转换
- 低→高
- 有些从高级别到低级别的情况会自动转换
class Demo6
{
public static void main(String[] args)
{
int a = 55;
float b = 6.6f;
long c = 77l;
double d = 99;
int num = 'a';//低级别自动转为高级别 输出为97
double sum = a + b + c + d;
System.out.println("Hello World!");
}
}
-
注意点:
-
不能对布尔值进行转换;
-
不能把对象类型转换为不相干的类型;
-
在把高容量转换到低容量的时候,强制转换;
-
转换的时候可能存在内存溢出,或者精度问题:
操作比较大的数时,要注意溢出问题!!!
public class TypeConversion2 { public static void main(String[] args) { // 操作比较大的数时,注意溢出问题 // JDK 7新特性,数字之间可以用下划线分割 int money = 10_0000_0000; // long money = 10_0000_0000; // long money = 10_0000_0000L; //由于末尾的小写l容易误认,最好用大写L int years = 20; int total = money * years; // 计算时会溢出 long total2 = money * years; // money * years默认是int,转换前已将存在问题了 long total3 = money * ((long) years); // 先把一个数转换为long System.out.println(total); System.out.println(total2); System.out.println(total3); } }
-