Java是一门强类型语言,数据类型和变量是构建程序的基石。理解数据类型的选择和变量的定义方式,直接影响代码的性能和可读性。就一句话:数据类型和变量很重要!
1. 字面常量
我们刚接触Java时,曾写过一个简单的程序:
public class Main {public static void main(String[] args) {System.out.println("hello,world!");}
}//运行结果:
hello,world!
这里,无论程序何时运行,运行结果都是输出:hello,world!
其实这里的 hello,world! 就是字面常量。常量,即程序运行期间,固定不变的量。在现实生活中同样有常量,打个比方:一个小时60分钟,一天24小时。
通常,常量可以分为以下几类:
字符串常量:由""括起来的,比如:"123"、"hello"、"你好"等
整型常量:程序中直接写的数字(注:无小数点),比如:123、111、12等
浮点数常量:程序中直接写的小数:比如:1.2、3.14、5.2等
字符常量:由''括起来的单个字符,比如:'a'、'A'、'2'等
布尔常量:只有两种:true 和 false
空常量:null(后续篇幅介绍)
2. 数据类型
在Java中,数据类型主要分为两类:基本数据类型和引用数据类型。
基本数据类型
基本数据类型简单概括为 四类八种
四类:整型、浮点型、字符型和布尔型
八种:用表格表示如下:
注意:
- Java中,不论是在16位系统还是32位系统下,int 都占用4个字节,long 都占用8个字节。
- 整型和浮点型都是带符号的(+ 和 -)
- Java中,整型默认为 int,浮点型默认为 double。
什么是字节?
字节是计算机中表示空间大小的基本单位,计算机使用二进制表示数据,我们认为8个二进制位(bit) 为一个字节(Byte)。我们平时的计算机为 8GB 内存,意思是 8G 个字节,其中:
1KB = 1024Byte,1MB = 1024KB,1GB = 1024MB。
3. 变量
3.1 什么是变量?
在我们写的程序中,除了有始终不变的常量外,还有经常改变的内容,比如说:人的年龄、身高、体重等,对于这些经常改变的内容,在Java中,称之为变量。上述的数据类型就是用来定义不同种类变量的。
3.2 语法格式
定义一个变量的语法格式如下:
数据类型 变量名 = 初始值;
例如:
public class Test1 {public static void main(String[] args) {int a = 10; //定义一个整型变量a,a是变量名也称为标识符,//该变量中储存的值为10double b = 3.14;char c = 'A';boolean d = true;System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(d);a = 100; //因为a是变量,因此它的值可以修改,//= 在Java中表示赋值,右边的值给左边System.out.println(a);//注意:在一行可以定义多个相同类型的变量int a1 = 1,a2 = 2,a3 = 3;System.out.println(a1);System.out.println(a2);System.out.println(a3);}
}
3.3 变量定义需要注意的事项
当我们定义了一个变量时,通常要对它进行初始化,一般有两种方式:
方式1:在定义时给初始值,例如
int a = 10;
System.Out.println(a);
方式2:在定义时没有给初始值,但在使用时要给,不然编译器会报错。
int b;
b = 10;
System.Out.println(a);
3.4 整型变量
3.4.1 整型变量
在进入整型变量之前,先来介绍一下 包装类型。包装类型简单来说就是把这个类型和围绕着这个类型的一些方法进行包装,然后对这个包装体进行命名,注意包装类型是引用类型。Java为所有的基本数据类型都提供了包装类型。
整型 int 的为: Integer 。
public class Test2 {public static void main(String[] args) {//可以通过 包装类型. 的方式调用包装类型中的方法System.out.println(Integer.MAX_VALUE); //调用这个方法,查看 int 的最大值System.out.println(Integer.MIN_VALUE); //调用这个方法,查看 int 的最小值}
}//运行结果
2147483647
-2147483648
注意事项:
- 在定义 int 型变量时,所赋值不能超过 int 的范围。
- 推荐使用方式一定义,如果没有合适的初始值,可以设置为0。
3.4.2 长整型变量
长整型 long 的包装类型为: Long 。
public class Test3 {public static void main(String[] args) {System.out.println(Long.MAX_VALUE);System.out.println(Long.MIN_VALUE);}
}//运行结果
9223372036854775807
-9223372036854775808
注意事项:
- 长整型变量的初始值后加 l 或 L ,推荐加 L。例如:long a = 100L;
- Java中,长整型不论在那个系统下都占8个字节。
- 在定义 long 型变量时,所赋值不能超过 long 的范围。
3.4.3 短整型变量
短整型 short 的包装类型为:Short 。
public class Test4 {public static void main(String[] args) {System.out.println(Short.MAX_VALUE);System.out.println(Short.MIN_VALUE);}
}//运行结果:
32767
-32768
注意事项:
- 在Java中,short在任何系统下都占2个字节。
- 在定义 short 型变量时,所赋值不能超过 short 的范围。
3.4.4 字节型变量
字节型 byte 的包装类型为:Byte 。
public class Test5 {public static void main(String[] args) {System.out.println(Byte.MAX_VALUE);System.out.println(Byte.MIN_VALUE);}
}//运行结果:
127
-128
注意事项:
- 在Java中,byte在任何系统下都占1个字节。
- 在定义 byte 型变量时,所赋值不能超过 byte 的范围。
3.5 浮点型变量
在Java中,int 除以 int 的值仍然是 int (会直接舍弃小数部分)。如果想要得到带有小数的结果,需要用到浮点型。
public class Test6 {public static void main(String[] args) {double num = 1.1;System.out.println(num * num);}
}//运行结果:
1.2100000000000002
3.5.1 双精度浮点型
双精度浮点型 double 的包装类型为:Double 。
注意事项:
- 在Java中,double在任何系统下都占8个字节。
- 浮点数与整数在内存中的存储方式不同,不能单纯使用的形式来计算。
- double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。
3.5.2 单精度浮点型
单精度浮点型 float 的包装类型为:Float 。
注意事项:
- 因为Java中浮点型默认为 double,因此在定义单精度浮点型变量初始化赋值时,需要在初始值后面加一个 F 或 f。例如 float num = 1.0F;
- float 类型在 Java 中占四个字节, 同样遵守 IEEE 754 标准.。由于表示的数据精度范围较小,一般在工程上用到浮点数 都优先考虑 double,不太推荐使用 float。
3.6 字符型变量
字符型 char 的包装类型为:Character 。
public class Test {public static void main(String[] args) {char c1 = 'a';char c2 = 'A';System.out.println(c1);System.out.println(c2);//Java的字符可以是中文char c3 = '帅';System.out.println(c3);}
}//运行结果
a
A
帅
注意事项:
- Java 中使用 单引号 + 单个字母 的形式表示字符字面值。
- 计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此 一个字符占用两个字节, 表示的字符种类更多, 包括中文。
- 关于字符编码方式的讨论, 参见https://zhuanlan.zhihu.com/p/35172335
3.7 布尔型变量
布尔型 boolean 的包装类型为 Boolean 。
布尔类型常用来表示真假,例如太阳从西边出来,这是假的,不可能的;而太阳从东边出来,这是真的。
注意事项:
- 布尔型变量只有两种取值,要么真 true ,要么假 false 。
- Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法。
- Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在 Oracle公司的虚拟机实现中,boolean占1个字节。
4.类型提升
在Java中,不同类型数据之间相互运算时,会把数据类型小的提升为数据类型大的。例如:
int a = 10;
long b = 100L;
long c = a + b; //编译成功:a + b 的结果的数据类型为 long,赋值给 long变量c,合理。
int c = a + b; //编译失败:a + b 的结果的数据类型为 long,赋值给 int变量c,不合理。
注意事项:
- 不同类型的数据混合运算, 范围小的会提升成范围大的。
- 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算,即运算结果的数据类型为 int 。
5. 类型转换
Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验。
在Java中,当参与运算的数据类型不一样时,就会进行类型转换,其中Java的类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。
5.1 自动类型转换
自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数据范围大的时会自动进行。例如:
public class Test {public static void main(String[] args) {int a = 10;long b = 100L;b = a;System.out.println(b);}
}//运行结果:
10
5.2 强制类型转换
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成,即需要我们手动设置。特点:数据范围大的到数据范围小的。
public class Test {public static void main(String[] args) {int a = 10;long b = 100L;a = (int) b; //这里进行了强制类型转换,()内表示要转换的类型System.out.println(a);}
}//运行结果
100
注意事项:
- 强制转换可能导致精度丢失(如浮点转整型)或数值溢出(如大整数转小整数)。
- 强制类型转换不一定能成功,不相干的类型不能互相转换。例如 int 和 boolean 。
6. 引用数据类型
Java为我们提供了很多种引用数据类型,比如说:类、接口、数组、String等等,这里暂且介绍 String。
字符串类型 String
在Java中,我们通常用 String 定义字符串类型,比如:
public class Test {public static void main(String[] args) {String c1 = "hello ";String c2 = "world!";System.out.println(c1);System.out.println(c2);System.out.println(c1 + c2); //c1 + c2 表示将c1和c2进行拼接}
}//运行结果
hello
world!
hello world!
字符串可以和整形数字之间进行转换:
1.int 转换为 String
int num = 10;
String str1 = num + ""; //方法一
String str2 = String.valueOf(num); //方法二,使用 String 提供的方法。
2.String 转换为 int
String str = 100;
int num = Integer.parseInt(str); //使用 int 包装类型提供的方法。
到此,本篇文章完!至于其他的引用类型,将会在后续文章中介绍,对本篇文章如有异议,还请各位看官提出,您的批评就是对我最大的鼓励!谢谢!!!