java使用两种数据类型,对现实世界进行分类:
JAVA是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间:JAVA中,整数的默认类型是int;小数的默认类型是double
1.基本数据类型:(四类八种)
整数类:byte short int long(存在四种整数类型的原因:根据内存的不同,合理分配内存空间) --------- 默认值:0
小数类:float double(可能出现小数位不精确的现象) ------------------------------------------------------------- 默认值:0.0
字符类:char -------------------------------------------------------------------------------------------------------------------- 默认值:\u0000
注:char是关键字,并且属于基本数据类型,使用单引号括住一个字符。而String属于引用数据类型中的类,使用双引号括住多个字符。在计算机中以ASCII码/unicode码等(以数字代替字符)来存储字符。
布尔类:boolean ----------------------------------------------------------------------------------------------------------------默认值:false
注:方法体外部的基本类型变量存在默认值,方法体内部定义的局部变量则无默认值。
2.引用数据类型:除了基本数据类型以外的所有类型
类class、数组[ ]、接口interface
数据类型间的转换:
默认转换:byte,short,char—int—long—float—double
强制转换:目标类型 变量名=(目标类型)(被转换的数据);
注:布尔类型不能转为其它类型;byte,short,char相互之间不转换,他们参与运算首先转换为int类型。
相关注意事项:
不同数据类型的赋值要求:
/**
案例:使用8种数据类型定义变量
JAVA中,整数的默认类型是int;小数的默认类型是double。
*/
class Demo01{
public static void main(String[] args){
/*
将int类型的123赋值给byte,也是把大类型的数据赋值给小类型,但不会赋值;
定义byte、short类型的变量只要右边的整数数值在范围内,就可以复制给byte、short
*/
byte a = 123;
short b = 489;
int c = 456;
/*
int类型范围小于long类型,转型是会自动在数值位补零。
加上L的原因是:可以对d赋超出int类型范围的值。即告诉计算机以8个字节存储256。
*/
long d = 256L;
/*
报错:从double转换到float可能会有损失;
原因:这是一条赋值语句,是把等号右边的值,赋值给等号左边的变量,等号
*/
float e = 1.2f; //小数的默认类型是double,添加f不会出现不兼容的错误提示。
double f = 1.5;
char g = 'c'; //字符有单引号括住,并且只能有一个字符
boolean m = true;
}
数据类型间的运算:
/**
数据类型之间的运算:
byte,short,char类型是不能直接参与运算的,需要先转成int类型。
默认转换:byte,short,char—int—long—float—double
给byte,short赋值的时候,先看等号的右边有没有变量:
1.如果有变量,就按照上面的规则看右侧范围是否在左边的范围之内,若超过则会报错。
2.如果都是常量,就看最终的结果是否在左边的范围之内,如果在就可以直接赋值。
*/
class DataTypeDemo3{
public static void main(String[] args){
byte b1 = 3,b2 = 4,b;
/*
错误:不兼容的类型:从int转换到byte可能会有损失
原因:b1,b2是变量,并且它的类型默认转为int类型,此时int类型范围
是大于byte的,而程序只有在解释阶段(java阶段)才会知道变量的范围,
因此在编译阶段会出现错误。
*/
b = b1 + b2;
b = 3 + 4; //正确,类似于byte b = 7;
float f = 12.4f;
/*
通过程序演示,发现可以把一个8字节的long类型数值赋值给4个字节的
float类型变量。主要原因是二者使用二进制表示形式的不一致,因为
float的范围是远远大于长整型long的
*/
float f1 = 134L;
float f2 = 120; //正确,int类型范围小于float
float f3 = 120.0; //错误,double类型的范围大于float,需要改写成120.0f
}
}
基本类型中的char类型:
char类型直接打印,用的是它所代表的字符。char类型参与运算,用的是他底层的编码。
/**
ASCII 美国首先编写的,只用到了0-127。ASCII码占用了1byte 0-255 -->使用数字代表字符
(前32个字符实际是没有意义的,主要是打印的时候使用)
GBK码->GB2312码->GB18320码,中国编写的,主要存中文字符。英文/数字 1个字节;中文 2个字节
ISO:国际标准化组织。将各个国家编的码表统一在了一起,unicode(万国码/字符集) 占用2个字节
由于unicode占用2个字节,而英文只占用1个字节。在使用unicode编写英文时会浪费资源。
因此在unicode的基础上出现了另外一些码表:
--- utf-8(可变字节数来表示字符) 英文/数字 1个字节;中文 3个字节
--- utf-16
Big5:台湾地区使用。
char的默认值为"\u0000",\u表示使用unicode编码,本质上代表0,表现形式是空格。需要注意的是ASCII码有表示空格的数字
char占两个字节(0-65535),使用unicode编码。
*/
class DataTypeDemo4{
public static void main(String[] args){
//char类型直接打印,用的是它所代表的字符。char类型参与运算,用的是他底层的编码。
char ch1 = 'a';
System.out.println(ch1);
System.out.println(ch1+1);
char ch2 = 98;
System.out.println(ch2);
char ch3 = '\u0063'; //"\u"后面是4位的十六进制,即99
System.out.println(ch3); //c
}
}
字符串、字符与整数的计算:
/**
+ : 正号;加法运算;字符串的拼接。
要注意运算的顺序:从左到右依次运算,有括号的先算括号里的。(先算乘除,后算加减)
String和任意类型做加法,得到的都是String,值就是拼接后的结果
java不同于C++,布尔类型不能和其它基本数据类型做运算。即java中的true不代表1。
*/
class DataTypeDemo5{
public static void main(String[] args){
int a = +10;
System.out.println('a'); //a
System.out.println('a' + 1); //98
System.out.println("hello" + 'a' + 1); //helloa1
System.out.println('a' + 1 + "hello"); //98hello
System.out.println("5+5=" + 5 + 5); //5+5=55
System.out.println("5+5=" + (5+5)); //5+5=10
System.out.println(5 + 5 +"=5+5"); //10=5+5
//System.out.println(true + '1'); //错误:二元运算符‘+’的操作类型错误
System.out.println(true + "1"); //true1
}
}
强制类型转换:
/**
强制类型转换的格式:目标类型 变量名 = (目标类型)常量/变量;
基本数据类型:除了boolean类型以外,其它7种类型都可以相互转换;
一般是在把大类型转成小类型的时候使用强制类型转换。
引用数据类型:也可以使用强制类型转换,但必须具备子父类的关系。
*/
class ForceTypeTransform{
public static void main(String[] A){
int a = 10;
long b = a; //默认类型转化:byte,short,char—int—long—float—double
System.out.println(b);
long c = 10;
//int d = c; //错误:不兼容的类型,从long转换到int可能会有损失
int d = (int)c; //强制类型转换
byte by = (byte)130;
System.out.println(by) //结果是-126
}
}
上述代码中130>byte的范围,对他强制转型后等于-126。原理如下: