1、数据类型的作用是什么?
程序当中有很多数据,每一个数据都是有相关类型的,不同数据类型的数据占用空间大小不同。
数据类型的作用是指导JVM在运行程序的时候给该数据分配多大的内存空间。
2、Java中的数据类型包括两种
1)基本数据类型
2)引用数据类型
*类
*接口
*数组
......
3、基本数据类型:
1)基本数据类型包括四大类八小种
第一类:整数型
byte short int long
第二类:浮点型
float double
第三类:布尔型
boolean
第四类:字符型
char
4、字符串("abc")不属于基本数据类型,属于引用数据类型,字符属于基本数据类型
* 字符串使用双引号 "abc"
* 字符使用单引号 'a'
5、八种基本数据类型各自占用的空间大小是多少?
基本数据类型 占用空间大小【单位:字节】 取值范围 默认值
--------------------------------------------------------------------------------------------------------------------
byte 1 (-128~127) 0
short 2 (-32768~32767) 0
int 4 (-2147483648~2147483647) 0
long 8 (-2^63~2^63-1) 0
float 4 (大约±340282347E+38F) 0.0f
double 8 0.0d
boolean 1 true/false false
char 2 (0~2^16-1)从0~65535 '\u0000'
//数据类型默认值
public class DefaultValue{
static byte by;
static short s;
static int i; //成员变量
static long lg;
static float f;
static double d;
static boolean b;
static char c;
public static void main(String[] args){
/*
变量遵守:先声明,再赋值,才能访问
成员变量如果没有手动赋值系统会默认赋值【局部变量没有赋值,访问则会报错】
*/
System.out.println("byte数据类型默认值:"+by); //0
System.out.println("short数据类型默认值:"+s); //0
System.out.println("int数据类型默认值:"+i); //0
System.out.println("long数据类型默认值:"+lg);//0
System.out.println("float数据类型默认值:"+f);//0.0
System.out.println("double数据类型默认值:"+d);//0.0
System.out.println("boolean数据类型默认值:"+b);//false
System.out.println("char数据类型默认值:"+c); //'\u0000'
}
}
6、现代计算机底层采用的是交流电的方式,接通和断开就两种状态。
7、字节(Byte)
1 Byte = 8 bit 【1个字节 = 8个比特位】1个比特位表示一个二进制位:1/8
1 kB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
8、字符编码表
1)人为提前指定好"文字"和"二进制"之间的对照关系,这种对照关系被称为:字符编码
2)最先出现的字符编码是:ASCII码
01100001 ------按照ASCII编码--------->'a'
'a' -----------按照ASCII解码---->01100001
3)编码和解码的时候采用同一套对照表,不会出现乱码
编码和解码的时候采用不同的对照表,就会出现乱码
4)java语言采用Unicode编码方式
9、数据类型之char
public class DataType_Char{
//数据类型之char
public static void main(String[] args){
//定义一个char类型的变量,起名c,同时赋值字符'a'
char c = 'a';
System.out.println(c);
//一个中文占用2个字节,char类型正好是2个字节
//所以java中的char类型变量可以存储一个中文字符
char c1 = '国';
//编译报错,ab是一个字符串不能使用单引号括起来
//char c2 = 'ab';
//"a"是字符串类型;c3变量是char类型,类型不兼容,编译报错
//char c3 = "a";
/*
转义字符 \
反斜杠\在Java当中具有转义功能
\n 换行符
\t 制表符tab
\' 普通的单引号
\\ 普通的反斜杠
\" 普通的双引号
转义字符出现在特殊字符之前,会将特殊字符转换成普通字符。
*/
System.out.print("中国"+'\n'+"南京");
/*
System.out.println()和System.out.print(c)区别:
print 表示只输出,但不换行
println 表示输出之后换行
*/
System.out.println('\n');
System.out.println("中国");
System.out.print("南京");
System.out.println('\n');
System.out.print("中国");
System.out.println("南京");
//在控制台上输出反斜杠字符
/*
反斜杠将后面的单引号转义成不具备特殊含义的普通单引号字符
左边的单引号缺少了结束的单引号字符,编译报错
*/
/*
char c = '\';
System.out.println(c);
*/
char single_backslash = '\\';
System.out.println(single_backslash);
//在控制台上输出一个单引号字符
/*
java中不允许这样编写程序,编译报错
char particular_case = '';
*/
char single_quotation = '\'';
System.out.println(single_quotation);
//在控制台上输出带双引号的helloworld
System.out.println("”hello world“");
System.out.println("\"hello world\"");
/*
JDK中自带的native2ascii.exe命令,可以将文字转换成Unicode编码形式
怎么使用这个命令?
在命令行输入native2ascii,回车,然后输入文字之后回车即可得到unicode编码
*/
//编译错误
//char g = '4e2d';
//char g = 'u4e2d';
//编译通过:反斜杠u联合起来后面的一串数字才是某个文字的Unicode编码
char unicode_to_native = '\u4e2d';//'中'对应的unicode编码是 4e2d
System.out.println(unicode_to_native);
}
}
10、数据类型之整数型
1)java语言当中的"整数型字面值"被默认当作int类型来处理。要让这个"整数型字面值"被当作long类型来处理的话,需要在"整数型字面值"后面添加l/L,建议使用大写的L。
2)java语言当中的整数型字面值有三种表示方式:
第一种方式:十进制【是一种缺省默认的方式】
第二种方式:八进制【在编写八进制整数型字面值的时候需要以0开始】
第三种方式:十六进制【在编写十六进制整数型字面值的时候需要以0x开始】
3)当一个整数字面值没有超出byte,short,char的取值范围,这个字面值可以直接赋值给byte,short,char类型变量,这种机制SUN允许了,目的是为了方便程序员的便程。
public class DataType{
//数据类型之char
public static void main(String[] args){
/*
123这个整数型字面值是int类型
i变量声明的时候也是int类型
int类型的123赋值给int类型的变量i,不存在类型转换
*/
int i = 123;
System.out.println(i);
/*
456整数型字面值被当作int类型,占用4个字节
x变量在声明的时候是long类型,占用8个字节
int类型的字面值456赋值给long类型的变量x,存在类型转换
int类型转换成long类型
int类型是小容量
long类型是大容量
小容量可以自动转换成大容量,被称为自动类型转换机制
*/
long x = 456;
System.out.println(x);
/*
2147483647字面值是int类型,占用4个字节
y是long类型,占用8个字节,自动类型转换
*/
long y = 2147483647;
System.out.println(y);
/*
编译错误:过大的整数:2147483648
2147483648被当作int类型4个字节处理,但这个字面值超出了int类型范围
*/
//long z = 2147483648
//解决错误:2147483648字面值一上来就当做long类型来处理,在字面值后面添加L
long z = 2147483648L;
System.out.println(z);
long m = 100L;
/*
m变量是long类型,8个字节
n变量是int类型,4个字节
编译报错,大容量不能直接赋值给小容量
大容量转换成小容量,需要进行强制类型转换
强制类型转换需要加"强制类型转换符"
加上强制类型转换符之后编译通过了,但是运行阶段可能损失精度
所以强制类型转换谨慎使用,因为损失精度之后可能损失严重
强制原理:
原始数据:00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
强转后的数据:00000000 00000000 00000000 01100100
将左边的二进制砍掉【所有数据强转都遵循此原理】
*/
//int n = m;
int n = (int)m;
/*
byte类型的变量,只要字面值不超过byte类型的取值范围,不用强转,直接可以赋值
*/
//byte b0 = 50;//编译可以通过
//byte b1 = 127;//编译通过
//byte b2 = 128;//编译不通过
byte b3 = (byte)128;//强转之后为 -128,严重损失进精度
System.out.println(b3);
}
}
11、数据类型之浮点型
float 单精度【4个字节】
double 双精度【8个字节,精度较高】
double的精度太低,不适合做财务软件,财务软件要求精度较高,所以SUN公司
在基础SE类库当中为程序员准备了精确度更高的类型,只不过这种类型是一种
引用数据类型,不属于基本数据类型,它是:java.math.BigDecimal
其实java程序中SUN提供了一套庞大的类库,Java程序员是基于这套基础的类库来进行开发的。
**SE类库位置:D:\programe file\ProgramBooks\JDK\jdk11.06\lib\src.zip\java.base\java
在java语言当中,所有的浮点型字面值,默认被当作double类型来处理,
要想该字面值当做float类型来处理,需要在字面值后面添加F/f
注意:
double和float在计算机内部二进制存储的时候存储的都是近似值
计算机的内存资源是有限的,用有限的资源存储无限的数值只能存储近似值
public class DataType{
//数据类型之float
public static void main(String[] args){
/*
3.0是double类型的字面值
d是double类型的变量
不存在类型转换
*/
double d = 3.0;
System.out.println(d);
/*
5.1是double类型的字面值
f是float类型的变量
大容量转换成小容量,需要进行强制类型转换,所以下面一句程序编译报错
float f = 5.1;
解决方案:
第一种:强制类型转换
float f = (float)5.1;
第二种:没有强制类型转换
float f = 5,1f;
*/
}
}
12、数据类型之布尔型
在java语言当中boolean类型只有两个值:true、false,没有其他值
在底层存储的时候boolean类型占用1个字节,因为实际存储的时候false底层是0,true是1
布尔类型在实际开发使用频率较高,主要用在逻辑运算和条件控制语句当中
public class DataType{
//数据类型之float
public static void main(String[] args){
//编译报错:不兼容的类型
//boolean flag = 1;
boolean loginSuccess = true;
if(loginSuccess){
System.out.println("恭喜你登陆成功");
}else{
System.out.println("对不起,用户名不存在或密码错误!");
}
}
}
13、基本数据类型之间的互相转换:转换规则
1)八种基本数据类型当中除布尔类型之外,剩下的7种类型之间都可以互相转换
2)小容量向大容量转换,称为自动类型转换,容量从小到大排序
byte< short < int < long < float < double
char <
注:
任何浮点类型不管占用多少个字节,都比整数型容量大
char和short可表示的种类数量相同,但是char可以取更大的正整数
3)大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过,但是在运行阶段可能会损失精度,所以谨慎使用。
4)当整数字面值没有超出byte、short、char的取值范围,可以直接赋值给byte、short、char类型的变量
5)byte、short、char混合运算的时候,各自先转换成int类型再做运算
6)多种数据类型混合运算,先转换成容量最大的那种类型再做运算
public class DataType{
//数据类型之float
public static void main(String[] args){
/*
java中的运算会转换成容量最大的类型来进行计算
10和3默认为int类型,所以运算后的最大类型也是int
*/
double num1 = 10d;
float num2 = 3f;
float num3 = 10.0f;
long num4 = 10;
//num1的值是:10.0 num2的值是:3.0
System.out.println("num1的值是:"+num1+'\t'+"num2的值是:"+num2);
int result0 = 10/3;
System.out.println(result0);//3
float result1 = 10/3;
System.out.println(result1);//3.0
double result2 = 10/3;
System.out.println(result2);//3.0
/*
int result3 = (int) num1/num2;
编译报错: 不兼容的类型: 从float转换到int可能会有损失
编译过程中会将num1先转换成int类型再与float类型的num2进行相除运算,
运算后的结果为floa类型,float类型的字面值直接赋值给int型会出现类型不兼容
*/
int result3 = (int)(num1/num2);//运算符优先级问题,用括号括起来先相除,再强转,再赋值
System.out.println(result3);//3
double result4 = num1/num2;
System.out.println(result4);//3.3333333333333335
double result5 = 10.0/3;
System.out.println(result5);//3.3333333333333335
double result6 = num3/3;
System.out.println(result6);//3.3333332538604736
byte result7 = (byte)(int)(num4/3);
System.out.println(result7);//3
short i = 5;
byte j = 10;
/*
错误,short和byte运算,首先会转换成int再运算
所以运算结果为int,int赋值给short就会出现精度丢失问题
short h = i + j;
可以将运算结果强制转换成short
short h = (short) i + j;
*/
}
}