一、包装类(Wrapper Class)
- Java是面向对象语言,但是Java中的基本数据类型却是不面向对象的,但在实际使用中,经常需要将基本数据转化成对象,便于操作,为了使基本类型具备对象的特性,Java提供了包装类,就可以像操作对象一样操作基本类型数据。
- 包装类均位于java.lang包,使用时系统会自动导入。
- 基本类型和包装类的对应关系:
基本数据类型 | 包装类 | 基本数据类型 | 包装类 |
---|---|---|---|
byte | Byte | float | Float |
int | Integer | double | Double |
short | Short | boolean | Boolean |
long | Long | char | Character |
- 包装类的作用
- 提供字符串、基本数据类型、对象之间相互转化的方式。
- 包含每种基本数据类型的相关属性,如最大值、最小值。
- 自动装箱:基本类型自动的封装到与它相同类型的包装中,此过程调用valueOf方法。
例如:
Integer i = 100;
本质上是编译器编译时自动添加了
Integer i = new Integer(100);
- 自动拆箱:包装类对象自动转换成对应的基本类型,调用intvalue方法。
int a = new Integer(100);
本质上是编译器编译时自动添加了
int a = new Integer (100).intValue();
- 缓存问题:当通过自动装箱机制创建包装类对象时,首先会判断数值是否在[-128,127]的范围内,如果满足条件,则当作基本数据类型来处理,从缓存中寻找指定数值,若找到缓存,则不会创建新的对象,只是指向指定数值对应的包装类对象,否则将创建一个新的对象,会返回在堆中分配的内存地址。
实例:
Integer a1 = 1234;
Integer a2 = 1234;
System.out.println(a1 == a2);
System.out.println(a1.equals(a2));
Integer a3 = 123;
Integer a4 = 123;
System.out.println(a3 == a4);
System.out.println(a3.equals(a4));
运行结果:
二、变量和常量
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
变量在使用前必须对其声明,只有在变量声明以后,才能为其分配相应长度的存储单元,每个变量都有类型,可以是基本类型,也可以是引用类型,常用的引用类型有:类、接口和数组。
- 实例变量:也称成员变量,是在方法外部、类的内部定义的变量,如果不进行初始化,会自动初始化成该类型的默认初始值,保存在堆中,随着对象的创建而存在,随着对象的消失而消失。
- 静态变量:又称类变量,用static修饰,可以由类名或对象调用,存储在方法区中,静态变量的生存周期为整个源程序,,但只能在定义改变量的函数内使用该变量。
- 局部变量:方法或语句块内部定义的变量,只在这个范围内有效,在使用前必须声明和初始化,保存在虚拟机栈中,系统根据变量大小自动分配存储空间,作用的范围结束时变量的空间自动释放。
- 常量:在编译的时候统一进行处理,变量名大写,只能被初始化一次。
三、运算符
优先级 | 运算符 | 简介 | 结合性 |
---|---|---|---|
1 | [ ]、. 、( ) | 方法调用,属性获取 | 从左到右 |
2 | ! 、~、++、- - | 一元运算符 | 从右向左 |
3 | *、/、% | 乘、除、取余 | 从左向右 |
4 | +、- | 加、减 | 从左向右 |
5 | <<、>>、>>> | 左移、右移、无符号右移 | 从左向右 |
6 | <、<=、>、>=、instanceof | 小于、小于等于、大于、大于等于、对象类型判断是否是同类型 | 从左向右 |
7 | ==、!= | 两个值是否相等,两个值是否不相等 | 从左向右 |
8 | & | 按位与 | 从左向右 |
9 | ^ | 按位异或 | 从左向右 |
10 | l | 按位或 | 从左向右 |
11 | && | 短路与 | 从左向右 |
12 | ll | 短路或 | 从左向右 |
13 | ? | 条件运算符 | 从右向左 |
14 | =、+=、-=、*=、/=、%=、l=、^=、<、<=、>、>=、>>= | 混合赋值运算符 | 从右向左 |
- 算术运算符:+、 - 、* 、 / 、%(取余)、 ++(自增)、 - -(自减)
例:
int a = 3;
int b = a++; //执行完毕后,b=3,先给b赋值,再自增
int c = ++a; //执行完毕后,c=5,先自增,再给c赋值
System.out.println("a = "+a);
System.out.println("b = "+b);
System.out.println("c = "+c);
System.out.println(-5 % 2);
System.out.println(-5 % 2);
System.out.println(5 % -2);
System.out.println(5 % 2);
运行结果:
“+”还可用于字符串的连接,运算符两侧的操作数中只要有一个是String类型,系统会自动将另一个操作数转换为字符串然后进行连接。
- 赋值运算符:=
- 关系运算符:< (小于)、<=(小于等于)、>(大于)、>=(大于等于)、== (等于)、!=(不等于)
- 位运算符:&(按位与),|(按位或),^(按位异或),~,<<(左移),>>(右移),>>>(无符号右移)
说明:a << x=a2^x
b >> y=b2^(-y)
例:
int a = 4;
int b = 7;
System.out.println(a & b);
System.out.println(a | b);
System.out.println(a ^ b);
System.out.println(~a);
int c1 = a * 2 * 2;
int c2 = a << 2;
int d1 = a / 2 / 2;
int d2 = a >> 2;
System.out.println("c1 = "+c1);
System.out.println("c2 = "+c2);
System.out.println("d1 = "+d1);
System.out.println("d2 = "+d2);
运算结果:
- 逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑非)
说明:逻辑与和逻辑或采用短路的方式,从左到右计算,如果确定值则不会再进行下去。
例:
boolean a = 1 > 2 && 2 > (3/0);
boolean b = 1 < 2 && 2 > (3/0);
System.out.println("a = "+a); //执行结果为false,未抛异常说明 2>(3/0)未被执行
System.out.println("b = "+b); //1<2结果为ture,执行2>(3/0)时报错
- 扩展赋值运算符: +=,-=, *=,/=
运算符 | 用法举例 | 等效表达式 |
---|---|---|
+= | a += b | a = a + b |
-= | a -= b | a = a - b |
*= | a *= b | a = a * b |
/= | a /= b | a = a / b |
%= | a %= b | a = a % b |
-
条件运算符:?、:
- 三元条件运算符:常用来代替简单的if-else判断
- 语法格式:x ? y : z
- 三元条件运算符:常用来代替简单的if-else判断
说明:x为boolean类型表达式,先计算x的值,若为ture,则此三元运算的结果为表达式y的值,否则整个运算结果为表达式z的值。