快速回忆
- 什么是常量?
- 常量的分类?
- 什么是变量?
- 变量的定义及注意事项?
- 基本数据类型有哪些?
- 自动转换和强制转换
知识讲解
2.1 常量
常量:在Java运行的过程中赋值后不会更改的数据。常量存储在常量池中,JDK7之前常量池在方法区中,JDK7后常量池在堆内存中。
2.1.1 常量的类型
常量的类型 | ||
---|---|---|
整数常量 | 所有的整数 | 180,85, 2 |
小数常量 | 所有的小数 | 1.86, -0.1,Math.PI |
字符常量 | 单引号引起来,只可写一个字符,必须有内容 | 'a' , ' '(空格) |
字符串常量 | 双引号引起来,可以写多个字符,也可以不写 | "HelloWorld" ,"你好世界" ,"" |
布尔常量 | 只有两个值 | true false |
空常量 | 只有一个值 | null |
2.1.2 常量的声明
使用final关键字修饰声明,PI就是一个声明好的常量。
public static final double PI = 3.14159265358979323846;
2.1.3 常量的调用
javap -p -v 类名.class
可通过上述命令窗口指令打印常量池。
public class ConstantDemo {
public static void main(String[] args){
//输出整数常量
System.out.println(123);
//输出小数常量
System.out.println(0.125);
System.out.println(Math.PI);
//输出字符常量
System.out.println('A');
//输出布尔常量
System.out.println(true);
//输出字符串常量
System.out.println("你好Java");
}
}
2.2 变量和数据类型
2.2.1 计算机的存储单元
位(bit):计算机的存储单元的最小单元,它只能表示0,1两个状态。
字节(Byte):字节是由8个位组成(00000000~11111111)是计算机中处理数据的基本单位。一个字节可以可以表示256(2^8)个不同的值。
常见的存储容量单位 | |
---|---|
千字节(KB) | 1 KB = 1024 字节 |
兆字节(MB) | 1 MB = 1024 KB |
吉字节(GB) | 1 GB = 1024 MB |
太字节(TB) | 1 TB = 1024 GB |
拍字节(PB) | 1 PB = 1024 TB |
2.2.2 数据类型
java语言是强类型的语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。因为表达方式和表达形式的不同,因此不同数据类型拥有着不同的数据大小。
java中要求一个变量每次只能保存一个数据,必须要明确保存的数据类型。
2.2.3 数据类型分类
基本数据类型:四类八基本
引用数据类型:类,接口,数组
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1个字节(8位) | -128~127(-2^7~2^7-1) |
短整型 | short | 2个字节 | -32768~32767 |
整型 | int(默认) | 4个字节 | -2的31次方~2的31次方-1 |
长整型 | long | 8个字节 | -2的63次方~2的63次方-1 |
单精度浮点数 | float | 4个字节 | 1.4013E-45~3.4028E+38 |
双精度浮点数 | double(默认) | 8个字节 | 4.9E-324~1.7977E+308 |
字符型 | char | 2个字节 | 0-65535 |
逻辑类型 | boolean | 1个字节 | true,false |
java中输入整数默认为int类型,小数默认为double类型。
2.2.4 变量
在程序运行过程中可以变化的量称为变量,即变量是用来存储和表示数据的容器,是内存(堆内存)中的一部分。
2.2.5 变量的定义
变量的定义由变量的数据类型 、 变量名 、 数据值组成:
数据类型 变量名 = 数据值
其中变量名的命名规则与Java标识符的命名规则一致。
2.2.6 变量定义的注意事项
①变量名唯一:在同一个作用范围内,变量的名字不可以相同。
②变量赋值才有意义:定义的变量,不赋值不能使用。
③取值范围大的数值赋值给取值范围小的类型变量,会出现编译错误。
2.3 类型转换
在Java中,不同类型的存储空间大小是不一样的。基本数据类型在内存中占用的空间大小是固定的,而封装类则会占用更多的空间,因为它们需要额外的内存来存储对象的状态信息。
在Java中,基本数据类型和其对应的封装类之间存在着自动转换的关系。这意味着可以将一个基本数据类型的值直接赋给其对应的封装类对象,或者将一个封装类对象直接赋给其对应的基本数据类型。这种转换是由编译器自动完成的,无需显式地进行类型转换。
另外一种通用的转换方式是强制转换。强制转换可以将一个数据类型转换为另一个数据类型,但需要注意的是,如果转换的目标类型与原始类型之间存在不兼容的关系,可能会导致数据丢失或者运行时错误。因此,在进行强制转换时需要谨慎,并且需要确保转换是安全的。
2.3.1 java类型转换规则
java类型转换一般在常量或变量赋值及作为方法参数传递时发生;
若是基本数据类型发生,则判断等号左边被赋值量的数据类型和右边的引用值数据类型的关系。除byte类型外,若引用值的数据的取值范围更大则发生强制转换(强制类型转换,需要手动),若数据值溢出则取模赋予。若引用值类型取值范围更小,则发生自动转换。byte可在其支持的范围内,可直接使用int赋予。
若是引用数据类型发生,则判断需求类和引入类之间的关系,可以发生转换一定存在父子或其它继承关系,否则则发生向上转型或向下转型,子类引用为父类重写子类实现的方法。
注意概念是 将“取值范围小的类型”自动提升为“取值范围大的类型”的,而不是将“占用内存小的”自动转换为“占用内存大的”,如long→float自动转换。
2.3.2 自动类型转换
将 取值范围小的类型 自动提升为 取值范围大的类型 的过程。
2.3.3 强制类型转换
将 取值范围大的类型 强制转换成 取值范围小的类型 。
char 类型和 short 类型之间永远需要互相强转
既而产生数值溢出或数据损失的问题,如:
- 浮点转成整数,直接取消小数点,可能造成数据损失精度。
- int 强制转成 short 砍掉2个字节,可能造成数据丢失。
2.4 运算符
运算符是对变量或常量进行操作的符号。
2.4.1 运算符概括
算数运算符 | + | 加法运算,拼接字符串 |
- | 减法运算 | |
* | 乘法运算 | |
/ | 除法运算 | |
% | 取模运算,两个数字相除取余数 | |
++,-- | 自增自减运算 | |
赋值运算符 | = | 等于号 |
+= | 加等 | |
-= | 减等于 | |
*= | 乘等于 | |
/= | 除等于 | |
%= | 取模等 | |
比较运算符 | == | 比较符号两边数据是否相等,相等结果是true。 |
< | 比较符号左边的数据是否小于右边的数据,如果小于结果是true。 | |
> | 比较符号左边的数据是否大于右边的数据,如果大于结果是true。 | |
<= | 比较符号左边的数据是否小于或者等于右边的数据,如果小于结果是true。 | |
>= | 比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是true。 | |
!= | 不等于符号 ,如果符号两边的数据不相等,结果是true | |
逻辑运算符 | && 短路与 | 1. 两边都是true,结果是true 2. 一边是false,结果是false 短路特点:符号左边是false,右边不再运算 |
|| 短路或 | 1. 两边都是false,结果是false 2. 一边是true,结果是true 短路特点: 符号左边是true,右边不再运算 | |
! 取反 | 1. ! true 结果是false 2. ! false结果是true | |
三元运算符 | 布尔类型表达式?结果1:结果2 | - 布尔类型表达式结果是true,三元运算符整体结果为结果1,赋值给变量。 - 布尔类型表达式结果是false,三元运算符整体结果为结果2,赋值给变量 |
2.4.2 加法运算符
2.4.3 算数运算符的使用
两个参与计算的数都是整数,那么计算结果会被强制转换为整数。
下面两个打印中第一个输出为整数类型,第二个则为小数类型。
public static void main(String[] args) {
int i = 1;
System.out.println(i*2/3);
System.out.println(i*2/3.0);
}
2.4.4 小数运算
计算机中小数是使用二进制及相应的算法来表示的,但是实际上二进制并不能表示所有的小数。
比如,对于小数1.5,它转换为二进制为1.1即
1*2^0+1*2^-1 = 1.5
无论如何决定着小数最后一位数字的二进制数一定为1*2^-n,也就是说只有小数位最后一位为5的情况下才能表达成一个有限的二进制数,否则会无限循环。
1.6 →(转换为二进制)→ 1.1001100110011……
而计算机中其它的运算都是基于二进制的,在使用小数运算时,因为小数表示的不准确,也造成了结果会出现更大的误差。
//结果为false
System.out.println(0.3-0.2==0.1);