编辑
前言
大家好,我是程序猿爱打拳。今天我给大家讲解的是Java基础中的数据类型。主要讲解的是整型变量、浮点型变量、字符型、布尔型、字符串型等,以及各个类型的应用场景以及注意事项。文章通俗易懂,适合零基础入门以及小白。
目录
1.数据类型
首先Java提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。其中四个整型分为:字节型、整型、短整型、长整型,两个浮点型分为:单精度浮点型和双精度浮点型。
数据类型 | 说明 | 占字节数 |
byte | 字节型 | 1字节 |
short | 短整型 | 2字节 |
int | 整型 | 4字节 |
long | 长整型 | 8字节 |
float | 单精度浮点型 | 4字节 |
double | 双精度浮点型 | 8字节 |
char | 字符型 | 2字节 |
boolean | 布尔型 | 未知,但Oracle公司虚拟机中占1字节 |
整型和浮点型他们都是变量,何为变量?下面我就来讲解。
2.常量与变量
2.1常量
常量在计算机中我们认为是永远不会发生改变的量。现实生活中我们可以理解为父与子的关系,儿子永远都是爸爸的孩子,这是改变不了的。
2.2变量
变量在Java里面是我们认为可以发生改变的量,首先我们要知道定义变量的语法格式为:数据类型 变量名 = 初始值;
例如一个名为a的变量。初始化是10我们对它进行改变为20,这就是一个变量a。对照以下程序理解:
public class Blog { public static void main(String[] args) { int a=10; System.out.println("变量a的初值为:"+a); a=20; System.out.println("改变后的a值为:"+a); } }
输出为:
编辑
以下为变量的几个定义方式:
//方法一:在定义时给出初始值
int a =10;
System.out.println(a);
//方法二:在定义时没有给初始值,但使用前必须设置初值
int b;
b = 10;
System.out.println(b);
//在方法二定义后,如果在使用这个变量前没有赋值,编译器会报错
int b;
System.out.println(b);
b = 10;
3.整型变量
我们知道变量的定义格式为数据类型 变量名 = 初始值;并且我们知道整型变量里面包含的几个类型都是用来表示数字的,那么整型变量的取值范围怎么求呢?我们可以使用各个类型的包装类.MIN_VALUE和.MAX_VALUE来分别求出最小值和最大值。
例如我要求整型int的最小值与最大值我们可以这样做:Integer.MIN_VALUE和Integer.MAX_VALUE这样我们就能求出整型的取值范围。各个数据类型的包装类如下表所示:
数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
3.1字节型
我们已经知道变量的定义和求取值范围方法后,来定义一个字节型变量num=10并求出字节型变量的范围:
import java.util.Scanner; public class Blog { public static void main(String[] args) { //定义一个字节型变量b=10 byte b = 10; System.out.println(b); //求字节型变量的取值范围 System.out.println(Byte.MIN_VALUE); System.out.println(Byte.MAX_VALUE); } }
结果如图所示:
编辑
注意事项:
1. byte在任何系统下都占1个字节
2. byte的范围是:-128 ~ 127
3. 字节的包装类型为Byte
3.2短整型
相信大家定义数据的过程已经熟门熟路了,我们直接定义一个短整型变量并求出短整型范围:
import java.util.Scanner; public class Blog { public static void main(String[] args) { //定义一个短整型变量a=10 short a = 10; System.out.println(a); //求短整型变量的取值范围 System.out.println(Short.MIN_VALUE); System.out.println(Short.MAX_VALUE); } }
输出结果为:
编辑
注意事项:
1. short在任何系统下都占2个字节
2. short的表示范围为:-32768 ~ 32767
3. 使用时注意不要超过范围(一般使用比较少)
4. short的包装类型为Short
3.3整型
定义一个整型变量num=10并求出整型变量取值范围:
import java.util.Scanner; public class Blog { public static void main(String[] args) { //定义一个整型变量num=10 int num = 10; System.out.println(num); //求整型变量取值范围 System.out.println(Integer.MIN_VALUE); System.out.println(Integer.MAX_VALUE); } }
输出结果为:
编辑
注意事项:
1. int不论在何种系统下都是4个字节
2. 推荐使用方式一定义,如果没有合适的初始值,可以设置为0
3. 在给变量设置初始值时,值不能超过int的表示范围,否则会导致溢出
4. 变量在使用之前必须要赋初值,否则编译报错
5. int的包装类型为 Integer
3.4长整型
为了区分长整型与整型,我们一般在数字后面加上L或l。例如定义一个长整型变量num=10,我们会这样写:long num =10L;或long num =10l;
import java.util.Scanner; public class Blog { public static void main(String[] args) { //定义一个长整型变量num=10 long num = 10L; System.out.println(num); //求整型变量取值范围 System.out.println(Long.MIN_VALUE); System.out.println(Long.MAX_VALUE); } }
输出结果为:
编辑
注意事项:
1. 长整型变量的初始值后加L或者l,推荐加L
2. 长整型不论在那个系统下都占8个字节
3. 长整型的表示范围为: -2的63次方~ 2的63次方-1
4. long的包装类型为Long
思考:byte、short、int、long都能定义整型变量为啥要区分这么开呢?
就好比生活中,衣服的尺码。衣服有婴儿装和成人装,我们成人不会穿婴儿装。类型也是如此,数字越大我们就需要更大的范围类型来定义。
4.浮点型变量
浮点型变量分为单精度浮点型和双精度浮点型两类,相信学过C语言的伙伴已经了解到了。但Java里面定义浮点型时需要一些细节,下面我就来一一讲解。
4.1单精度浮点型
定义一个单精度浮点型变量我们得在数字的后面加上f或者F,因为我们的定义的时候不加以说明编译器会默认变量为双精度浮点型。例如定义一个单精度浮点型num=10格式可以写成这样:float num =10f;或float num =10F;
public class Blog { public static void main(String[] args) { //定义一个浮点型变量num=1 float num=1.0F; System.out.println(num); } }
输出结果为:
编辑
注意事项:
1.float 类型在 Java 中占四个字节, 同样遵守 IEEE 754 标准。
2.由于float表示的数据精度范围较小, 一般在工程上用到浮点数都优先考虑 double, 不太推荐使用 float。
3. float的包装类型为Float。
4.2双精度浮点型
正常定义一个双精度浮点型变量:
public class Blog { public static void main(String[] args) { double num =3.14; System.out.println(num); } }
输出结果:
编辑
一段神奇的代码:
public class Blog { public static void main(String[] args) { int a = 1; int b = 2; System.out.println(a/b); } }
输出结果:
编辑
上述代码以我们的理解应该是输出0.5,但在 Java 中, int 除以 int 的值仍然是 int(会直接舍弃小数部分)。如果想得到 0.5, 需要使用 double 类型计算。如:
public class Blog { public static void main(String[] args) { double a = 1; double b = 2; System.out.println(a/b); } }
输出结果:
编辑
注意事项:
1. double在任何系统下都占8个字节
2. 浮点数与整数在内存中的存储方式不同,不能单纯使用相同的形式来计算
3. double的包装类型为Double
5.字符型变量
字符型见名知意我们可以定义一些关于字符的内容:
public class Blog { public static void main(String[] args) { char a = 'A'; char b = '?'; char c = '1'; char ch='帅'; System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(ch); } }
输出结果:
编辑
上述程序中,我定义了一个英文字母A、一个字符?、一个字符1、一个帅字。
注意事项:
1.在定义字符型内容时用英文状态下的单引号括起来如'A'。
2.计算机中的字符本质上是一个整数。 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符,因此一个字符占用两个字节,表示的字符种类更多。
6.布尔型
布尔型也不是很难理解,我们只需要知道布尔类型表示真(true)或假(false)就完了。我们结合代码来展示:
public class Blog { public static void main(String[] args) { boolean a = true; boolean b = false; System.out.println(a); System.out.println(b); } }
输出结果:
编辑
相信大家已经学过C语言,其实在C里面也是有boolean类型的,只是我们不常用到。还有在计算机中1表示真,0表示假。在boolean类型中我们却不能认为1表示true,0表示false。
编辑
当我们把一个布尔类型初始化为1时,会出现红色波浪线,代表着两个类型不兼容。
注意事项:
1.boolean类型只有两种取值true和false,它们分别表示真和假。
2.Java中boolean类型和int类型不能相互兼容,不存在1代表true,0代表false。
3.Java中没有明确规定boolean占几个字节,也没有专门来处理boolean的字节码 指令,因此我们认为boolean占字节未知,但Oracle公司虚拟机中占1字节
4.boolean的包装类为Boolean。
7.类型转换
Java是一个强类型编程语言,当不同类型相互赋值时就会进行类型转换。分为自动类型转换(隐式)、强制类型转换(显式)。
当我这样做:
public class Blog { public static void main(String[] args) { int a =10; long b =20L; b = a;//可以编译通过 a = b;//编译失败 } }
输出结果:
编辑
我们不难理解,上述代码中我们可以看出。Java里面只能让低类型变量的值赋值给高类型变量的值。
7.1自动类型转换(隐式)
隐式类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数据范围大的时会自动进行。下面我来举几个例子来理解:
例1
public class Blog { public static void main(String[] args) { System.out.println(1314);//整型默认情况是int System.out.println(3.14);//浮点数默认情况是double } }
正常输出结果:
编辑
在Java中整数默认情况下是int类型,浮点数默认情况下是double类型
例2
public class Blog { public static void main(String[] args) { int a = 10; long b = 10L; b = a; a = b; } }
报错:
编辑
报错原因:
当b=a时,a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值。
当a=b时,编译报错,long的范围比int范围大,会有数据丢失,不安全。
例3
public class Blog { public static void main(String[] args) { float a = 3.14F; double b = 5.12; b=a; a=b; } }
报错:
编辑
报错原因:
b=a,编译器会将f转换为double,然后进行赋值
a=b,double表示数据范围大,直接将float交给double会有数据丢失,不安全
通过上述三个例子,不难明白。当我们赋值错误时编译器会自动提示类型的不兼容。
7.2强制类型转换(显式)
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。特点:数据范围大的到数据范围小的。举几个例子:
例1
public class Blog { public static void main(String[] args) { int a = 10; long b = 20L; b = a; a=(int)b; System.out.println(a); System.out.println(b); } }
输出:
编辑
在自动类型转换中我们知道了,当long类型值赋值给int类型值时编译器会报错。因此为了达到目的,我们在long类型赋值给int类型前强制把long转换为int类型。
例2
public class Blog { public static void main(String[] args) { int a = 10; double b = 13.4; a =(int)b; System.out.println(a); System.out.println(b); } }
输出:
编辑
当我们将double类型的值强转为int类型后,我们发现小数部分给舍弃了。这样是不行的,如果在银行工作,我们将一个小数部分给舍弃了是对客户很不友好的。这就是强制类型转换,编译器不会报错。
例3
public class Blog { public static void main(String[] args) { int a = 257; byte b = (byte)a; } }
输出结果:
编辑
a的值为257超过byte范围,因此什么都没有输出。可见强制类型转换有时候是有些无用的。
注意事项:
1. 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型
2. 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失
3. 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查
4. 强制类型转换不一定能成功,不相干的类型不能互相转换
7.3类型提升
C语言中也有隐式转换,它们分为整型提升与整型截断。什么意思呢,当字符型和短整型操作数在使用前被转换为普通类型(整型)这就叫整型提升,当普通类型转换为更低精度类型时候会进行整型截断。
Java当中不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。这点跟C语言有些许不一样。我们来看几个例子:
例1
public class Blog { public static void main(String[] args) { int a = 10; long b = 20; int c = a + b; long d = a + b; } }
运行后出错:
编辑
出错点:
当int c = a+b时,因为long的类型要大于int类型,因此把long类型赋值给int类型是不合适的,会造成数据的丢失
当long d = a+b时,把long类型赋值给long类型,完全合理。
例2
public class Blog { public static void main(String[] args) { byte a = 10; byte b = 20; byte c = a+b; System.out.println(c); } }
报错:
编辑
报错点:
byte 和 byte 都是相同类型,但是出现编译报错。原因是: 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a和 b 都提升成 int, 再进行计算, 得到的结果也是 int,这是赋给 c,就会出现上述错误。
我们应该这样写:
public class Blog { public static void main(String[] args) { byte a = 10; byte b = 20; byte c = (byte)(a+b); System.out.println(c); } }
输出结果:
编辑
总结:
1. 不同类型的数据混合运算, 范围小的会提升成范围大的.
2. 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.
8.字符串类型
在Java中我们可以使用String类来定义字符串类型,比如:
public class Blog { public static void main(String[] args) { String str1="Hello"; String str2="World"; String str3="我是帅哥"; System.out.println(str1); System.out.println(str2); System.out.println(str1+str2); System.out.println(str3); } }
输出结果:
编辑
以上就是对字符串的一个定义,我们也可以用+号来实现两个字符串的拼接从而输出两个字符串拼接后的结果。
有些情况下,我们需要将字符串和整型数字之间进行转换:
1.int转成String
public class Blog { public static void main(String[] args) { int num = 18; //方法1 String str1 = num+"是最美的年龄"; //方法2 String str2 = String.valueOf(num); System.out.println(str1); System.out.println(str2+"是最美的年龄"); } }
输出结果为:
编辑
我们可以看到,将int转成String的方法有直接用+号拼接和使用String.valueOf()方法。
2 .String转成int
public class Blog { public static void main(String[] args) { String str="1314"; int num=Integer.parseInt(str); System.out.println(num); } }
输出结果:
编辑
我们直接使用Integer.parseInt()方法来实现String转成int。
以上就是本篇博文的内容,感谢您的耐心观看。
编辑
Never Give Up