1、本次的预计讲解的知识
1、Java中的各个数据类型的定义;
2、Java各种数据类型的使用;
3、第一次观察String类型的使用
2、具体内容(重点)
任何的程序严格来讲都属于一个数据的处理游戏。所以对于数据的保存必须有严格的限制,这些限制就体现在了数据类型的划分上,即:不同的数据类型可以保存不同的数据内容。
v Java一共分为两大类数据类型:基本数据类型、引用数据类型:
v 基本数据类型:
v 数值型:
v 整型:byte、short、int、long;→默认值:0
v 浮点型:float、double;→默认值:0.0
v 字符型:char;→默认值:”\u0000”
v 布尔型:boolean;→默认值:false
v 引用数据类型:数组、类、接口;→默认值:null
基本数据类型不牵扯到内存的分配问题,而引用数据类型需要开发者为其分配内存空间,而后进行关系的匹配。
基本数据类型分为8种、引用数据类型一共分为3种。这么多数据类型如何选择?
个人选择数据类型原则:
l 如果想表示整数就使用int,表示销小数就使用double;
l 如果要想描述日期时间数字或者表示文件(或内存)大小使用long;
l 如果要实线内容传递后者编码转换使用byte;
l 如果要想实现逻辑的控制,可以使用boolean描述。
l 如果要想描述中文,可以避免乱码问题
No. | 数据类型 | 大小/位 | 可表示的数据范围 |
1 | long(长整型) | 64 | -9223372036854775808~9223372036854775807 |
2 | int(整型) | 32 | -2147483648~2147483647 |
3 | short(短整型) | 16 | -32768~32767 |
4 | byte(位) | 8 | -128~127 |
5 | char(字符) | 16 | 0~65536 |
6 | float(单精度) | 32 | -3.4E38(-3.4×)~3.4E38(3.4×) |
7 | double(双精度) | 64 | -1.7E308(-1.7×)~1.7E308(1.7×) |
如果按照保存范围:byte < int < long < doble.
2.1、整型
任何一个数字常量(例如:30、100)那么都属于int类型的数据类型,即:在Java之中所有的设置的整数内容默认情况下都是int类型。
范例:定义int型常量
public class TextDemo { public static void main(String[] args) { //为变量设置内容使用如下格式 //数据类型 变量名称 = 常量 ; int num = 10 ; //10是常量,常量的默认类型是int int result = num* 2 ; //利用num常量的内容乘以2,并且将值赋给result System.out.println(result); } } |
定义完变量之后可以实现变量的四则运算。
实际上变量与常量最大的组别只有一个:常量的内容是固定的,变量的内容是可改变的
public class TextDemo { public static void main(String[] args) { //所有的变量名称在同一块代码之中只允许声明一次 int num = 10 ; //10是常量,常量的默认类型是int num = num * 2 ; //取出num变量的内容乘以2,并且将其设置给num变量 System.out.println(num); } } |
每一种数据类型都有其对应数据类型的保存范围,那么下面来观察一个程序。
范例:如果超过int最大值或最小值的结果
public class TextDemo { public static void main(String[] args) { int max = Integer.MAX_VALUE ; //取出最大值 int min = Integer.MIN_VALUE ; //取出最小值 System.out.println(max); //2147483647 System.out.println(min); //-2147483648 //int变量 ± int型常量 = int型数据 System.out.println(max + 1);//最大值加一:-2147483648 System.out.println(min - 1);//最小值减一:2147483647 System.out.println(min - 2);//最小值减二:2147483646 } } |
现在就感觉整个代码变成了一种循环的形式,最大值如果继续增加就变成了最小值,随后一直向其次的最小值进行循环,反之最小值减一就变成为了最大值。因为任何的数据的计算都是按照二进制进行的,第一位是符号,而其它的31位是数据位。
此种现象称为数据的溢出,那么如果要想去解决这种溢出的问题,就只能够扩大范围的方式来实现,比int范围更大的是long数据类型。
范例:扩大范围
public class TextDemo { public static void main(String[] args) { int max = Integer.MAX_VALUE ; //取出最大值 int min = Integer.MIN_VALUE ; //取出最小值 System.out.println(max); //2147483647 System.out.println(min); //-2147483648 //int变量 ± long型常量 = long型数据 System.out.println(max + 1L);//最大值加一:2147483648 System.out.println(min - (long)1);//最小值减一:-2147483649 //long变量 ± int型常量 = long型数据 System.out.println((long)min - 2L);//最小值减二:-2147483650 } }
|
在程序的世界里面,数据类型的转换有以下规律:
l 数据范围小的数据与数据范围大的数据进行数学计算的时候,自动向大的数据类型转换后计算;
l 数据范围大的数据要变为数据小的数据,那么必须采用强制转换;
l 如果是常量进行强制转换,有两种是:常量标记(L、l)、使用“(数据类型)”
现在为止计算结果是正确的,所以要想成功的解决数据溢出,一定要使用更大范围的数据。
只要你写的代码属于正常是可以使用的的代码,基本上数据溢出的情况很少见。
以上的代码是利用了数据的转型解决了数据的操作错误,但对于程序的而言,除了可以将范围小的数据类型变为范围大的类型职位,也可以将范围大的数据类型变为范围小的数据类型,那么就必须使用“(数据类型)”的格式完成。
范例:将范围大的数据类型变为范围小的数据类型
public class TextDemo { public static void main(String[] args) { long num = 1000 ; //1000常量是int型,使用long接受,发生了向大范围转型的操作 int x = (int) num ;//把long变为int System.out.println(x); } } |
如果所保存的数据拆过了int的范围,那么依然会出现数据溢出的情况
public class TextDemo { public static void main(String[] args) { long num = 2147483650L ; int x = (int) num ;//把long变为int System.out.println(x); } } |
在整型数据之中,byte型数据是一个非常有用处的数据类型,首先byte型数据它的取值范围:-128~127之间。
范例:byte的转化问题
public class TextDemo { public static void main(String[] args) { int num = 130 ; //此范围超过了byte定义 byte x = (byte) num ; //由int变为byte System.out.println(x); } } |
由于byte使用的特殊性,Java对其有了一些很好的改善。
范例:观察byte操作
public class TextDemo { public static void main(String[] args) { byte num = 100 ; System.out.println(num); } } |
虽然任何一个整数都属于int型,但是Java编译的时候,如果发现使用的数据变量类型为byte,并且设置的数据在byte之内,那么就会自动的帮助用户实现数据类型的转换。反之,如果超过了,则依然会以int型为主。
提示:所有的变量在使用的时候一定不要去相信默认值,都设置具体内容。
如果在方法里面定义的默认值是不起作用的。
public class TextDemo { public static void main(String[] args) { int num; //没有默认值 num = 0; //在使用此变量之前设置内容 System.out.println(num); } } |
以上的操作形式是属于下先定义了一个变量num,但是此变量没有设置内容,而后设置了num变量的内容,最后在使用此变量,可是一以上的代码在JDK1.4以前的版本那么是不可能编译通过的。最标准的做法是在定义变量的时候直接设置好默认值
public class TextDemo { public static void main(String[] args) { int num = 0; System.out.println(num); } } |
你自己编写的代码使用,90%都去考虑使用int型类型数据。
2.2、浮点数
浮点数就是小数,Java之中只要是小数,那么对应的数据类型就是double型数据(double是保存范围最广的的类型)。
范例:定义小数
public class TextDemo { public static void main(String[] args) { //10.2是一个小数所以属于double型 double num = 10.2 ; //double型 * int型(转化为double,2.0) = double型 System.out.println(num * 2); } } |
由于的默认的小数类型就是double,所以如果使用了float表示需要将double型变为float,需要采用强制转换。
范例:使用float型
public class TextDemo { public static void main(String[] args) { float f1 = 10.2F ; float f2 = (float)10.2 ; System.out.println(f1 * f2); } } |
但是发现最终的结果有一点问题,变为了“104.03999”(这个后面的9还算是少的),这的问题追溯起来从JDK1.0时候就存在这个bug,解决不了,只能通过后期的处理完成。
额外附送:实际上最早开发的时候,考虑道内存的问题,往往能使用float就不使用double,例如:J2ME开发的时候,由于内存可苛刻往往会压缩数据范围,以节约空间。现在随着硬件成本的降低,所以使用double与float区别就不大了,那么就直接double数据。
需要注意的时候,所有的数据类型只有double才可以保存小数,那么观察下面的代码。
public class TextDemo { public static void main(String[] args) { int x = 9 ; int y = 5 ; System.out.println(x / y); } } |
此时如果进行了除法计算发现最终的计算结果变为了1,因为所有的小数位被忽略了。此时要想得出正确的结果,则可以将其中的一个整形变为浮点型
public class TextDemo { public static void main(String[] args) { int x = 9 ; int y = 5 ; System.out.println(x / (double)y); } } |
以后的开发之中,一定要考虑到整型的不保留小数的问题。
2.3、字符型:char
byte是属于字节,按照传统的概念来讲,一个字符 = 两个字节,对于字符除了与字节有一些关系之外,主要的关系在于与int型变量的转换。
在计算机的世界里面一切都是编码的形式出现的,Java用的十六进制UNICODE编码,此类编码可以保存任意的文字,但是这个编码在设计的过程之中,考虑到与其它语言的结合问题(C/C++),那么在此编码里面包含了ASCII码的部分编码,所以如果之前类似的开发,那么此处口可以完全无缝的衔接。
在程序之中使用“’’”声明的内容称为字符。每一个单引号只能够保存一个字符。
范例:定义字符
public class TextDemo { public static void main(String[] args) { char c = 'A' ; //字符 //字符可以和int型互相转换(以编码的形式出现 int num = c; System.out.println(c); System.out.println(num); } } |
经过测试发现一些编码情况:
l ‘A’(65) ~ ‘Z’(90);
l ‘a’(97) ~ ‘z’(122);
l ‘0’(48) ~ ‘9’(57)
其中“A”的编码值要小于“a”的编码值32,那么可以利用简单的计算来实现大小写转换。
范例:实现转换过程
public class TextDemo { public static void main(String[] args) { char c = 'A' ; //是大写 int num = c ;//需要将字符变为int型才可以使用加法计算 num = num + 32 ; //变为小写字母的编码 c = (char) num ; System.out.println(c); } } |
传统的编程语言之中,字符里面能够保存一些英文字母的标记,由于使用了UNICODE编码,这种十六进制的编码可以保存任意的文字,可以设置一个中文字符
public class TextDemo { public static void main(String[] args) { char c = '陈' ; int num = c ; System.out.println(num); } } |
正因为现在的中文保存的方便,所以在处理断句的时候很好用。
只有在处理中文的时候,字符数据才有那么一点点的帮助。其他的情况下几乎用不到字符。
2.4、布尔型
布尔是一个数学家的名字,布尔型是一个逻辑结果,主要保存两个数据:true、false。这类的数据主要用于一些程序的逻辑使用上。
范例:观察boolean
public class TextDemo { public static void main(String[] args) { //布尔只有两种取值:true、false boolean flag = false; if (!flag) {//if(布尔值){满足条件的操作} System.out.println("Hello World."); } } } |
在许多的语言之中,由于设计的初期,没有考虑到布尔型的问题,那么就使用的数字0表示false,而非数字0表示true(例如:1、2、3都表示ture),但是这样的设计对于代码开发比较混乱。Java里面不允许使用0或1来填充布尔型的变量内容。
2.5、String数据
只要是项目开发,100%使用使用String,但是与其它的几种基本数据类型相比,String属于引用数据类型(类,在Java里面只要是名称,每一个单词的首字母都是大写的),但是这个类比较的特殊。
String表示的是一个字符串,即:多个字符的集合,String要求使用我们的“”””声明其内容。
范例:观察String操作
public class TextDemo { public static void main(String[] args) { //数据类型 变量 = "内容" ; String str = "Hello World!";//字符串变量 System.out.println(str); System.out.println("Hello World!");//字符串常量 } } |
在String操作里面,也可以使用“+”进行字符串的连接操作。
范例:字符串连接
public class TextDemo { public static void main(String[] args) { String str = "Hello"; str = str + " World ";//连接 str += "!!!"; //连接 System.out.println(str); } } |
数学计算里面有“+”,字符串里面有“+”,那么一起是由呢?
public class TextDemo { public static void main(String[] args) { int numa = 100; double numb = 99.0 ; String str = "加法计算:" + numa + numb; System.out.println(str); } } |
从之前讲解的数据类型来说,任何的数据类型向范围大类型进行转化换,那么如果是int和double,int先变为double,而后记性加法计算,但是如果遇见了String,那么一切都变了可以简单理解为,所有的数据类型如果遇见了String的“+”,那么所有的数据类型都先变为String数据,而后再执行字符串的连接操作,那么自然结果知错的,此次是只有通过“()”来改变计算结果。
public class TextDemo { public static void main(String[] args) { int numa = 100; double numb = 99.0 ; String str = "加法计算:" + (numa + numb); System.out.println(str); } } |
先执行括号内的加法计算,而后再将结果与字符进行连接。
在Java里面也支持多种转义字符的使用,例如:换行(\n)、制表符(\t)、\(\\)、双引号(\”)、单引号(\’)
范例:转义字符
public class TextDemo { public static void main(String[] args) { String str = "Hello \"World\" \n\tHello MLDN"; System.out.println(str); } } |
这些转义字符在Java的学习过程之中考虑到格式显示经常出现。
3、总结
1、一定要熟练常用的数据类型:整数用int、小数用double、逻辑用boolean;
2、long、byte、char在处理数据的时候会使用到;
3、数据类型的转换永远是小范围自动向大范围转换,如果将大范围变为小范围要考到强制转换;
4、int和char之间的互相转换是以编码为主的,大写字母和小写字母之间差了32个长度的;
5、String是一个特殊的类,用于描述字符串,字符串用于“”””声明,利用“+”实现字符串的连接。