目录
计算机只认识二进制,那么计算机是怎么表示现实世界当中的文字的呢?
JAVA是强类型语言,所有的变量必须先定义才能使用。
-
数据类型的作用:
程序当中有很多数据,每一个数据都是有相关类型的,不同数据的数据占用空间大小不同。数据类型的作用是指导JVM在运行程序的时候给该数据分配多大的内存空间。
-
JAVA中的数据类型包括两种
-
基本数据类型
-
引用数据类型
引用数据类型又包括:类、接口、数组
-
-
基本数据类型(四大类八小种)
- 整数型
- byte 占一个字节范围:[-128~127]
- short 占两个字节范围:[-32768~32767]
- int 占四个字节范围:[-2147483648~2147483647]
- long 占八个字节范围:[-9223372036854775808~9223372036854775807]
- 浮点型
- float 占四个字节
- double 占八个字节
- 布尔型 boolean
- 占一个字节 取值:true、false
- 字符型
- char 占两个字节 取值范围:[0~65535]
注意:short和char所表示的种类总数是一样的,只不过char可以表示更大的正整数。因为char没有负数。
- 整数型
-
八种数据类型的默认值
数据类型 默认值 -------------------------------------------------------------- byte、short、int、long 0 0 0 0L float、double 0.0 Boolean false【在C语言中,true是1,false是0】 char \u0000
public class DateTypeText01 { //这里的static必须加 static int k = 1000; //变量还是遵循这个语法:先声明,再赋值,才能访问。 //成员变量没有手动赋值,系统会默认赋值【局部变量不会】 static int f;//成员变量 public static void main(String[] args){ /* int i;//局部变量 System.out.println(i); */ System.out.println(k); System.out.println(f);//0 } }
-
字符串“abc”不属于基本数据类型,属于"引用数据类型”,字符属于基本数据类型:
- 字符串使用双引号“abc
- 字符使用单引号’a’
-
计算机在任何情况下都智能识别二进制。例如:只认识1001101010010110010…
【现代计算机底层采用交流电的方式,接通和断开两种状态,计算机只识别1或0,其他不认识】
-
二进制:数据的一种表示形式。十进制表示满十进一。二进制表示满二进一。
十进制 0 1 2 3 4 5 6 7 8 … 二进制 0 1 10 11 100 101 110 111 1000 … 2的几次方 6 5 4 3 2 1 0 2的次方展开 64 32 16 8 4 2 1 97转二进制数 1 1 0 0 0 0 1 100转二进制 1 1 0 0 1 0 0 *97转二进制:64+32+1,所以下面是1,其他的没有的是0
*100转二进制:64+32+4,这三位下面是1,其他位是0
-
字节(byte):
1Byte = 8 bit 【1个字节=8比特位】1个比特位表示一个二进制位:1/0 1KB = 1024 Byte 1MB = 1024KB 1GB = 1024MB 1TB=1024GB 1TB=1024 x 1024 x 1024 x 1024 x 8
-
关于java中的数字类型,数字都是有正负之分的,所以在数字的二进制当中有一个二进制位被称为“符号位”,在所有的二进制位的最左边,0表示正数,1表示负数。
//byte类型最大值:01111111 (127) //byte类型最小值:-128【具体的怎么用二进制表示,和原码、反码、补码有关】 //byte类型可以表示256个不同的数字【256个不同的二进制数】
计算机只认识二进制,那么计算机是怎么表示现实世界当中的文字的呢?
-
八种基本类型中:byte、short、int、long、float、double、boolean这七种数据类型,计算机在表示的时候比较容易,因为底层都是数字,十进制的数字和二进制之间存在一种固定的转换规则。
-
但是char类型所表示的是现实世界中的文字,文字和计算机二进制之间“默认”情况下是不存在任何转换关系的。
为了让计算机可以表示现实世界的文字,我们需要进行人为的干涉,需要人负责提前制定好“文字”和“二进制”之间的对照关系。这种对照转换关系被称为:字符编码。
-
计算机最初只支持英文,最先出现的字符编码是:ASCII码【采用一个字节编码】
'a'---->97【01100001】 // 'a'——按照ASCII解码——>01100001 // 01100001——按照ASCII编码——>'a' 'A'---->65 '0'---->48
编码和解码的时候采用同一套对照表——不会出现乱码
解码和编码时采用的不是同一套对照表——出现乱码问题
-
随着计算机的发展,后来出现了一种编码方式,是国际化标准组织ISO制定的,这种编码方式支持西欧语言,向上兼容ASCII码,仍然不支持中文。这种编码方式是:ISO-8859-1,又被称为latin-1
随着计算机向亚洲发展,计算机开始支持中文、日文、韩文等国家文字,其中支持简体中文的编码方式:GB2312<GBK<GB18030
-
支持繁体中文:大五码<big5>
-
后来出现了一种编码方式同意了全球所有的文字,容量较大,这种编码方式叫做:unicode编码,Unicode编码方式有很多具体的实现:UTF-8、UTF-16、UTF-32 ... ...
-
JAVA语言源代码采用的是Unicode编码方式,所以"标识符"可以使用中文。
-
实际开发中,一般使用UTF-8较多【统一编码方式】
计算机二进制的三种表现方式:源码、反码、补码
-
计算机在任何情况下底层表示和存储数据的时候采用了补码形式。
正数的原码、反码、补码,都相同。
负数的补码:负数的绝对值的对应二进制的所有二进制位取反,再加一
public class DateTypeText06 { public static void main(String[] args) { /* 补码:10000000 , 源码计算过程: - 补码-1得到反码:10000000 - 1 --> 01111111 - 反码的所有二进制位取反得到原码:10000000 --> 128 - 原码对应数字为:128 */ /* 原始数据:00000000 00000000 00000000 11000110 - 强制类型转换之后:11000110 - 11000110现在在计算机中存储,他是一个补码,将补码转换成源码就是该数字: 11000110 - 1 --> 11000101 - 取反:00111010【 2 + 8 + 16 + 32】-->58 - 原码对应数字为:58 */ byte m=(byte)198; System.out.println(m); //-58 } }
char类型
public class main {
public static void main(String[] args){
//定义一个char类型的变量,起名c,同时赋值字符'a'
char c ='a';
System.out.println(c);
//一个中文占用2个字节,char类型正好是2个字节
//所以java中的char类型变量可以存储一个中文字符
char x = '国';
System.out.println(x);
//编译错误,ab是字符串,要用双引号。
// char y ='ab';
//"b"是字符串类型,k变量是char类型
//类型不兼容,编译错误
//char k ="b";
//声明
char e;
//赋值
e='e';
System.out.println(e);
//再次赋值
e='f';
System.out.println(e);
//======================================================
//字符拓展
char c1='a';
char c2='中';
System.out.println(c1);//a
System.out.println((int)c1);//(int)强制转换 //97
System.out.println(c2); //中
System.out.println((int)c2); //20013
//结论:所有的字符本质还是数字
//使用Unicode编码,可以处理各种语言,占两个字节。可以表示65536个字符。长度范围:0-65536
//Unicode编码表中,每个字/字母都有对应的数字 例:a=97 A=65 范围:U0000-UFFFF
//Excel 最长是2的16次方=65536
char c3='\u0061';
// Unicode转义字符:\u + 四个十六进制数字(范围:0~65535)
// \u0000:空字符
System.out.println(c3);//a
}
}
整数型
-
JAVA语言中的“整数型字面值”被默认当作int类型来处理。要让这个“整数型字面值”被当作long类型来处理的话,需要在“整数型字面值”后面加l/L,建议使用大写L。
-
java中的整数型字面值有三种表现方式:
-
十进制【是一种缺省默认的方式】
-
八进制【在编写八进制数字型字面值的时候需要以0开始】
-
十六进制【在编写十六进制整数型字面值的时候要以0x开始】
//二进制0b开头 十进制省略 八进制0开头 十六进制0x开头 public class DateTypeText05 { public static void main(String[] args) { int i = 10; int i2= 0b10; //二进制0b int i3= 010; //八进制0 int i4= 0x10; //十六进制0x 0-9 A-F System.out.println(i);//10 System.out.println(i2);//2 System.out.println(i3);//8 System.out.println(i4);//16 } }
-
整数型之间的类型转换
- 大容量接转换成小容量需要加强制类型转换符,有的会造成精度缺失
- 小容量可以自动转换成大容量,称为自动类型转换机制
public class DateTypeText05 {
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类型,占用四个字节
//y是long类型,占用八个字节,自动类型转换
long y= 2147483647;
System.out.println(y);
//编译错误:过大的整数:2147483648
//2147483648被当做int类型4个字节处理,但是这个字面值超出int类型范围
//long z= 2147483648;
//解决错误
//在字面值后面加L:使2147483648字面值一上来就当作long类型处理
//2147483648L是8个字节的long类型
//z是long类型变量,以下程序不存在类型转换
long z= 2147483648L;
System.out.println(z);
//---------------------------------------------------------------------------
//100L是long类型变量,x是long类型变量
//不存在类型转换
long x= 100L;
//x变量是long类型,8个字节 y变量是int类型,4个字节
//编译报错,大容量不能直接转换小容量
//int y= x;
//大容量转换成小容量,需要进行强制转换类型——需要加“强制类型转换符”
//加上强制类型转换符后编译通过,但是运行阶段可能损失精度
//所以强制类型转换要慎用,因为精度损失可能很严重
//强转原理:
//原始数据:00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
//强转之后的数据: 00000000 00000000 00000000 01100100
//将左边的二进制数砍掉【所有的数据强转时都是这样完成的】
int y= (int)x;
System.out.println(y);
//原始数据:00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000
//强转之后数据: 10000000 00000000 00000000 00000000
// 10000000 00000000 00000000 00000000目前存储在计算机内部,计算机存储数据都是采用补码的形式存储
//所以 10000000 00000000 00000000 00000000现在是一个补码形式
//将以上的补码转换到源码就是最终的结果。
long k =2147483648L;
int e= (int)k;
System.out.println(e);//输出【-2147483648】,精度损失非常严重
}
}
注意:当一个整数没有超出byte、short、char的取值范围,这个字面值可以直接赋值给byte、short、char类型的变量。这种机制SUN允许了,目的是为了方便程序员的编程
-
byte类型
public class DateTypeText06 { public static void main(String[] args) { //以下程序据目前所学 : 编译报错 //理由:50是int类型的字面值,b是byte类型的变量,int——>byte //大——>小 需要加强制类型转换符,没有加,所以报错 //实际 byte b= 50;//通过 byte c= 127;//通过 //byte b1= 128; //报错:128这个int类型的字面值已经超出了byte类型的取值范围,不能直接赋值给byte类型的变量。 //结论:在JAVA语言中,当一个整数型字面值没有超出byte类型取值范围时,该字面值可以 //直接赋值给byte类型的变量,不需要转换。超出时需要强制转换 //纠正错误,需要加强制转换符,但一定会损失精度 //原始数据:00000000 00000000 00000000 10000000 //强制转换后数据:10000000【这是存储在计算机内部的,是一个补码】 byte b1= (byte)128; System.out.println(b1);//-128 } }
-
short类型、char类型
short s= 32767;//通过 //short s1= 32768; //65535是int类型,4个字节 cc是char类型,2个字节 char cc= 65535; //cc=65536; 报错 //结论:当一个整数没有超出byte、short、char的取值范围,这个字面值可以直接赋值给byte、short、char类型的变量。这种机制SUN允许了,目的是为了方便程序员的编程
浮点数
float 单精度【4个字节】
double 双精度【8个字节,精度较高】
-
double和float在计算机内部二进制存储的时候存储的都是近似值。
-
在现实世界当中有一些数字是无限循环的,例如:3.33333333333…
-
计算机的资源是有限的,用有限的资源存储无限的数据只能存储近似值。
-
double精度太低【相对来说】,不适合做财务软件,财务涉及到钱的问题,要求精度较高,所以SUN在基础SE类库当中为程序员准备了精度更高的类型,只不过这种类型是一种引用类型,不属于基本数据类型,它是:java.math.BigDecimal
-
其实java程序中SUN提供了一套庞大的类库,java程序员是基于这套基础的类库进行开发的。所以要知道java的SE类库的字节码在哪儿,要知道java的源码在哪
- SE类字节码:C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar
- SE类源码:C:\Program Files\Java\jdk1.8.0_221\src.zip
例如:String.java和String.class 我们的(String[] args)中的String使用的就是String.class字节码文件
-
java语言中,所有的浮点型字面值【如:3.0】,默认被当作double来处理,
要想该字面值当作float类型来处理,需要在字面值后面添加F/f
public class DateTypeText07 { 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; //解决方案 //1强制类型转换 //float f=(float)5.1; //2:没有类型转换 float f= 5.1f; System.out.println(f); //浮点数拓展 银行业务的钱为什么不用浮点数表示 //而用BigDecimal表示——数学工具类 float f= 0.1F; double d= 1.0/10; System.out.println(f); System.out.println(d); System.out.println(f==d);//输出flase {f==d 判断f是否与d相等} //应该相等的数输出却不相等 float d1=143878658.1f; float d2=d1+1; System.out.println(d1); System.out.println(d2); System.out.println(d1==d2);// 输出true //应该不相等的数 输出却相等 //结论: //float 表示字长有限,但有些数除出来是无限的。也是离散的。 // 浮点数存在舍入误差(即四舍五入,是由于很多数字没有办法精确表示)。 // 所以输出结果是个大约数,是接近但不等于,是约等于出来的。 //***最好完全避免使用浮点数进行比较*** //***最好完全避免使用浮点数进行比较*** //***最好完全避免使用浮点数进行比较*** } }
布尔型:boolean
-
在java语言中,boolean类型只有两个值:true、false。没有其他值
不像C语言中,0和1可以表示和假真。
-
在底层存储时,Boolean类型占用1个字节,因为实际存储时false底层是0,true底层是1。
-
布尔类型在实际开发中非常重要,经常使用在逻辑运算和条件控制语句中。
public class DateTypeText07 { public static void main(String[] args) { //类型不兼容 //boolean flag=1; boolean loginsuccess= true; //if语句 if(loginsuccess){ System.out.println("恭喜你,登陆成功!"); }else{ System.out.println("对不起,用户名不存在或者密码错误"); } //布尔值拓展 boolean flag=true; if (flag=true){}//新手 if (flag){}//老手 //Less is More 更少的就是更多的 代码要精简易读 } }
基本数据类型之间的互相转换
转换规则:
-
八种数据类型中除布尔类型之外剩下的七种类型之间都可以互相转换
-
小容量——>大容量 ,称为自动类型转换,容量从小到大排序:
byte < short < int < long < float < double char <
任何浮点类型不管占用多少字节,都比整数型容量大
char和short可表示的种类数量相同,但是char可以取更大的正整数
//存在类型转换,int——>>char char c = 97;
-
大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过,但是在运行阶段可能会损失精度,所以谨慎使用。
-
当整数字面值没有超出byte、short、char的取值范围,可以直接赋值给byte、short、char类型的变量。
-
byte、short、char混合运算的时候,先各自转换成int类型再做运算
-
多种数据类型混合运算,先转换成容量最大的那种类型再做运算
示例
long g= 10;
//出现错误,多个数值在运算过程中,会转换成容量最大的类型
//以下示例最大的类型为 long,而 h 为 int,所以就会出现大类型(long)到小类 型(int)的转换,将会出现精度丢失问题
//int h = g/3;
//可以强制转换,因为运算结果没有超出 int 范围
//int h = (int)g/3;
//出现精度损失问题,以下问题主要是优先级的问题
//将 g 转换成 int,然后又将 int 类型的 g 转换成 byte,最后 byte 类型的 g 和 3 运算, 那么它的运算结果类型就是 int,所以 int 赋值给 byte 就出现了精度损失问题
//byte h = (byte)(int)g/3;
/*
byte b= 3; 可以编译通过,3没有超出byte类型取值范围
int i= 10;
byte b= i/3; 编译报错,编译器只检查语法,不会“运算” i/3
*/
short i = 10;
byte j = 5;
//错误,short 和 byte 运算,首先会转换成 int 再运算
//所以运算结果为 int,int 赋值给 short 就会出现精度丢失问题
//short k = i + j;
//可以将运算结果强制转换成 short
//short k = (short)(i + j);
//因为运算结果为 int,所以可以采用 int 类型接收
int k = i + j;
char l = 'a';
System.out.println(l);//a
//输出结果为 97,也就是 a 的 ascii 值
System.out.println((byte)l);//97
int m = l + 100;
//输出结构为 197,取得 a 的 ascii 码值,让后与 100 进行相加运算
System.out.println(m);//197
转义字符
-
反斜杠(\)在JAVA语言中具有转义功能。
-
System.out.pringtln()和System.out.print()的区别:
println输出后换行,print输出,但是不换行。
-
要求在控制台输出”反斜杠字符“、“单引号”以及某些特殊符号输出
转义字符出现在特殊字符之前,会将特殊字符转换成普通字符。
public class DateTypeText02 { public static void main(String[] args){ /* //反斜杠将后面的单引号转义成不具备特殊含义的普通单引号字符 //左边的单引号缺少了结束的单引号,编译报错 char l ='\'; System.out.println(l); */ //第一个反斜杠具有转义功能,将后面的反斜杠转义为普通的反斜杠字符。 //结论:在JAVA中两个反斜杠代表一个普通的反斜杠字符。 char l ='\\'; System.out.println(l);//输出\ System.out.println('\\');//输出\ System.out.println("\\");//输出\ //------------------------------------------------------- //JAVA中不允许这样编写程序,编译报错 //char a =''; //以下编译报错:第一个单引号和第二个单引号配对,最后的单引号找不到另一半 //char a ='''; //System.out.println(a); //反斜杠有转义功能,将第二个单引号转换成普通的单引号字符,第一个单引号和最后的单引号配对。 char d ='\''; System.out.println(d);//' System.out.println("'");//' //------------------------------------------------------- char s ='"'; System.out.println(s); System.out.println("“Hello World!”"); //输出“Hello World!” 这个是中文状态下的“” System.out.println("\"Hello World!\""); //输出"Hello World!"这个是英文状态下的"" } }
-
native2ascii.exe命令,可以将文字转换成unicode编码形式
使用命令的步骤:在命令行内输入naticve2ascii—>回车—>输入文字即可得到unicode编码
C:\Users\winer>native2ascii 是我的吗 \u662f\u6211\u7684\u5417 你过得怎么样 \u4f60\u8fc7\u5f97\u600e\u4e48\u6837
-
十六进制:0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 20 1a 1b 1c 1d 1e 1f 20
//编译错误 //char g = '4e2d'; //编译错误 //char g= 'u4e2d'; //通过:反斜杠u联合起来后面的一串数字是某个文字的unicode编码 char g= '\u4e2d'; System.out.println(g);
-
转义字符表
转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \n 换行(LF) ,将当前位置移到下一行开头 010 \r 回车(CR) ,将当前位置移到本行开头 013 \t 水平制表(HT) (跳到下一个TAB位置) 009 \v 垂直制表(VT) 011 \ 代表一个反斜线字符’’’ 092 ’ 代表一个单引号(撇号)字符 039 " 代表一个双引号字符 034 ? 代表一个问号 063 \0 空字符(NUL) 000 \ddd 1到3位八进制数所代表的任意字符 三位八进制 \xhh 十六进制所代表的任意字符 十六进制 //转义字符 // \t 表示制表符tab // \n 换行 回车键 System.out.println("Hello,kity"); System.out.println("Hello\tkity"); System.out.println("Hello\nkity");