目录
一. 字面常量
概念:在程序运行期间,固定不变的量就是常量。
比如下面的这段代码:
public class Demo{
public static void main(String[] args){
System.Out.println("hello world!");
System.Out.println(100);
System.Out.println(3.14);
System.Out.println('A');
System.Out.println(true);
System.Out.println(false);
}
}
其中,“hello world!”,100,3.14,‘A’,true 和 false都是常量,我们可以称之为字面常量。
1.1. 字面常量的分类
- 字符串常量:由双引号" "括起来的都是字符串常量。比如“123”,“hello”,“你好”。
- 整型常量:单由数字组成且没有小数点。比如123,100。
- 浮点型常量:带有小数点的数或者以科学计数法表示的数。比如3.14,1.23e4(表示的是1.23乘以10的4次方。)
- 字符常量:由单引号 ’ ’ 括起来的单个字符。比如’A’, ‘1’ , ‘好’。(Java的字符常量可以表示汉字。)
- 布尔常量:有且仅有true 和false。
- 空常量:null (小写)
二. 数据类型
在Java中数据类型主要分为两类:基本数据类型和引用数据类型。
2.1. 基本数据类型的分类
基本数据类型有4类8种。
4类:整型,浮点型,字符类型,布尔类型。
8种:byte,short,int,long,float,double,char,boolean。
数据类型 | 关键字 | 内存占用 | 范围 |
---|---|---|---|
字节类型 | byte | 1个字节 | -128 到 127 |
短整型 | short | 2个字节 | -32768 到 32767 |
整型 | int | 4个字节 | -231 到 231 -1 |
长整型 | long | 8个字节 | -263 到 263 -1 |
单精度浮点型 | float | 4个字节 | 有范围,但一般不关注 |
双精度浮点型 | double | 8个字节 | 有范围,但一般不关注 |
字符类型 | char | 2个字节 | 0 到 65535 |
布尔类型 | boolean | 没有明确规定 | true 和 false |
有关数据类型的注意事项:
- 对于Java来说,无论在什么位数的系统下,int 都占用4个字节,long 都占用8个字节。
- 整型和浮点型都是有符号的,所以整型和浮点型的最高位都是符号位。具体的存储规则可以参考
整型数据在内存中的存储原理
浮点数在内存中的存储原理 - 整型默认为 int 型,浮点型默认为 double 型。
- 字符串类型属于引用数据类型,不属于基本数据类型。
三. 变量
3.1. 变量概念
变量是一块内存空间,可以存储特定类型的不同字面常量。比如定义一个变量用来存储年龄,而年龄这个变量是可以赋予不同的值的。
不同种类的数据类型可以定义出不同种类的变量。比如定义一个int 类型的变量,这个变量的名字是age,那么这个age变量可以存储整型常量,但整型常量可以不同,比如18,30。
3.2. 语法格式
定义变量的语法格式:
数据类型 变量名 = 初始值;
注意:
- 变量的性质 (值的类型,值的精度和范围,可支持的操作等) 由数据类型决定。
- 最开始给变量放置的值就是初始值。
- Java当中,定义变量时,可以没有初始值,但局部变量在使用的时候,必须初始化,不知道该初始化为什么值就初始化为0。
3.3. 整型变量
整型可以分为byte,short,int,long,那么整型变量也可以分为 byte 型变量,short 型变量,int 型变量和 long 型变量。
3.3.1. int型变量
// int型变量所能表示的范围:
System.Out.println(Integer.MIN_VALUE);//-2147483648
System.Out.println(Integer.MAX_VALUE);//2147483647
// 注意:在定义int型变量时,所赋予的值不能超过int的范围
int d = 2147483648; // 编译时报错,初值超过了int的范围
Java当中,当你赋值的字面值常量一旦超过了变量能存储的最大值,会自动编译报错。就像上面代码中变量d存储的是 2147483648, 2147483648大于 int 变量能够存储的最大值2147483647。
但是但是,如果你赋值的不是字面值常量,而是表达式时,比如:
int a = 2147483647 +1;//此时不会报错,但输出a的结果是-2147483648
输出a的结果为什么是-2147483648呢,可以参考
整型数据在内存中的存储原理中的 2.3. 整数类型存储的取值范围
int型变量的注意事项:
- int 无论在那种系统下都占 4 个字节。
- 在给 int 变量设置初始值时,不能超过 int 能表示的范围,否则会导致溢出。(当然不止针对 int 类型的变量)
- int 的包装类型为 Integer(只有基本数据类型才有包装类型)
3.3.2. long型变量
int a = 10;//定义一个整型变量a做对照
long b = 10L; // 为了区分int和long类型,一般建议:long类型变量的初始值之后加L或者l
long c = 10l; // 一般更建议后面加大写L,因为小写l与1不好区分
// long型变量所能表示的范围:
System.out.println(Long.MIN_VALUE);//-9223372036854775808
System.out.println(Long.MAX_VALUE);//9223372036854775807
long型变量的注意事项:
- long 型变量的初始值后面加 l 或者 L ,小写的 l 容易与一混淆,所以建议加 L。
- long 无论在那种系统下都占 8 个字节。
- long 型变量存储的范围是 -263 到 263 -1,也就是 -9223372036854775808 到9223372036854775807。
- long的包装类型是Long (包装类型首字母都是大写)
3.3.3. short型变量
short d = 10;
// short型变量所能表示的范围:
System.out.println(Short.MIN_VALUE);//-32768
System.out.println(Short.MAX_VALUE);//32767
short型变量的注意事项:
- short 无论在那种系统下都占 2 个字节。
- short 型变量存储的范围是 -215 到 215 -1,也就是 -32768 到 32767
- short 的包装类型是 Short
3.3.4. byte型变量
byte e = 10;
// byte型变量所能表示的范围:
System.out.println(Byte.MIN_VALUE);//-128
System.out.println(Byte.MAX_VALUE);//127
byte型变量的注意事项:
- byte 无论在那种系统下都占1个字节。
- byte 型变量存储的范围是 -27 到 27 -1,也就是 -128 到 127
- byte 的包装类型是 Byte
3.4. 浮点型变量
3.4.1. double型变量
double f = 1.1;
//此时f中存的是1.1,f乘以f理应是1.21
System.out.println(f * f);//输出的结果是1.2100000000000002
double型变量的注意事项:
- double 无论在那种系统下都占8个字节。
- double 的包装类型是 Double
- double 类型的内存布局遵守 IEEE 754 标准, 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。
浮点数的存储方法可以参考浮点数在内存中的存储原理
3.4.2. float型变量
//为了区分float和double类型,建议:float类型变量的初始值之后加f或者F
float g = 1.1f;
float型变量的注意事项:
- float 无论在那种系统下都占4个字节。
- float 的包装类型是 Float
- float 类型的内存布局同样遵守 IEEE 754 标准,double 类型相比于 float 类型,能表示更精确的小数。
- 定义 float 型变量的初始值要加 f 或 F, 没有加 F 的初始值默认是 double 类型,占 8 个字节,加了 F 之后是 float 类型, 占 4 个字节。
3.5. 字符型变量
char c1 = 'A'; // 大写字母
char c2 = 'a'; // 小写字母
char c3 = '1'; // 数字字符
//java中可以存放汉字
char c3 = '酷';
字符变量的注意事项:
- 字符字面值用单引号加一个字符表示。
- Java 中使用 Unicode 表示字符,一个字符占用 2 个字节, 可以表示世界上的各种字符,包括中文。
Unicode包含ASCII码。 - 字符实际上是以整数的形式存储,所以字符型的本质是整型。尽管字符本质上是整型,但它们通常在输出或显示时以字符的形式呈现,而不是作为对应的整数值。
- char 的包装类型为 Character
3.6. 布尔型变量
boolean flg1 = true;
boolean flg2 = false;
boolean flg = true;
System.out.println(flg + 1);//error
布尔型变量的注意事项:
- boolean 类型的变量只有两种取值, true 表示真, false 表示假.
- Java 的 boolean 类型和 int 不能相互转换, 不存在 非0 表示 true, 0 表示 false 这样的用法。
- . Java 虚拟机规范中,并没有明确规定 boolean 占几个字节,也没有专门用来处理 boolean 的字节码指令,在Oracle公司的虚拟机实现中,boolean 占1个字节。
- boolean 的包装类型为 Boolean
3.7. 类型转换
在Java中,当参与运算的数据类型不一致时,就会进行类型转换。
Java中类型转换主要分为两类:
- 自动类型转换
- 强制类型转换
3.7.1. 自动类型转换(隐式转换)
自动,即代码编译的时候,编译器自动会帮你进行类型转换。
自动类型转换的特点:数值范围小的类型转换为数值范围大的类型
例子:
int a = 100;
long b = 10L;
b = a;//自动类型转换,int --> long,
//a和b都是整型,a的范围小,b的范围大,
//当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值
float f = 3.14F;
double d = 5.12;
d = f; // 自动类型转换,float --> double ,
//编译器会将f转换为double类型,然后进行赋值
自动类型转换的注意事项:
- 不同数据类型的变量之间赋值,表示范围较小的数据类型会自动转换为表示范围较大的数据类型。
- 整数常量默认被解析为int类型,浮点数常量默认被解析为double类型。
3.7.2. 强制类型转换(显式转换)
强制,即人为干涉,必须手动加上强制转换的类型,否则代码编译失败或者有数据丢失。
强制类型转换的特点:数值范围大的类型转换为数值范围小的类型
例子:
int a = 10;
long b = 100L;
a = (int)b; // 强制类型转换,long-->int,
//数据范围由大到小,需要在b的左边手动补上(int)表示变量b强制转换为int类型。
//没有加(int)会编译失败
float f = 3.14F;
double d = 5.12;
f = (float)d; //强制类型转换, double-->float,
//数据范围由大到小,需要强制类型转换,否则编译失败
a = d; // 编译失败:类型不兼容
a = (int)d; // 强制类型转换,double-->int,小数点之后全部丢弃
byte b1 = 100; // 100默认为int,没有超过byte范围,隐式转换
byte b2 = (byte)257; // 257默认为int,超过byte范围,
//需要显式转换,否则报错
boolean flag = true;
a = flag; // 编译失败:类型不兼容
flag = a; // 编译失败:类型不兼容
强制转换类型的注意事项:
- 如果需要把范围大的类型赋值给范围小的类型, 就需要强制类型转换, 但是精度可能会丢失。
- 强制类型转换不一定成功,不相干的类型不能强制类型转换(比如boolean不能强转为int类型),建议非必要不强转。
3.8. 类型提升
不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的
整型提升的两个规则:
- 不同类型的数据混合运算, 范围小的会提升成范围大的.
- 对于 short, byte, char 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算
- int 类型与 long 类型的运算 (float 与 double 类型的运算相同的道理)
int a = 10;
long b = 20;
//下面两行代码中的变量a都进行了类型提升,int-->long
long c1 = a + b;//更推荐这种写法
int c2 = (int)(a + b);
- byte 与 byte 类型的运算
byte a = 1;
byte b = 2;
byte c = a + b;//error,此时 a + b的结果已经是int类型,
//而c是byte类型,类型不符。
int d = a + b;//OK
char d = 'A';//字符A的Unicode码是65
int e = 1;
int f = d + e;//d先类型提升为int类型再进行计算
四. 字符串类型
字符串类型为 String, String 是引用数据类型,所以 String 没有包装类型,只有基本数据类型才有包装类型。
String str = "Hello";
int len = str.length();//字符串求长度
System.out.println(len);//5
String str2 = "34567";
int num1 = Integer.valueOf(str2);//字符串转成整数
System.out.println(num1 + 1);//34568
int num2 = 34567;
String str3 = String.valueOf(num2);//整数转成字符串
System.out.println(str3 + 1);//345671
字符串 + 其他类型
字符串 + 其他类型 中的加号意思是拼接。字符串拼接其他类型,结果打印的整体也是字符串。
如果是 a+b+‘‘a+b’’ 的形式,左边的 a+b 先相加,再与 “a + b” 拼接。
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a=" + a + "b=" + b);//a=10b=20
System.out.println(a + b);//30
System.out.println("a + b = " + a + b);//a + b = 1020
System.out.println(a + b + "a + b");//30a + b
}
输出结果: