【Java入门】变量与运算符
变量
定义
程序运行其中会产生一些临时数据,应用程序将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。
这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
数据类型
Java是一门强类型的编程语言,对变量的数据类型有着强制的限定。
Java中,变量的数据类型笼统的可以分为基本数据类型和引用数据类型。
- 基本数据类型
-
数值型
- 整形
- byte 字节型 1字节 -2^7 ~ 2^7 - 1
- short 短整型 2字节 -2^15 ~ 2^15 - 1
- int 整形 4字节 -2^31 ~ 2^31 - 1
- long 长整型 8字节 字面量后缀L(l)说明字面量类型为long类型 -2^63 ~ 2^63 - 1
- 浮点型
- 单精度浮点数 float 4字节 -3.40E+38 ~ +3.40E+38
- 双精度浮点数 double 8 4字节 -1.79E+308 ~ +1.79E+308
-
字符型 char 0 ~ 65535 每个数字都对应一个字符
-
布尔型 boolean true false
- 引用数据类型
- 类 class
- 接口 interface
- 数组
- 枚举 enum
- 注解 annotation
变量的声明与定义
todo
变量的类型转换
在程序中,当把一种数据类型的值给另一种数据类型的变量时,需要进行数据类型转换。
数据类型转换分为自动类型转换和强制类型转换
- 自动类型转换 (隐式类型转换)
两种数据类型兼容并且由精度低(或者范围小)的数据类型向精度高(或者范围大)的数据类型的变量赋值时会自动地进行类型转换
数值类型自动转换 byte --> short --> int --> long --> float --> double
int d1 = 100;
//String str = d1; 两种数据类型不兼容 无法进行类型转换
long d2 = d1; /*两种数据类型兼容 并且 由精度低(或者范围小)的数据类型向精度高
(或者范围大)的数据类型的变量赋值*/
- 强制类型转换 (显式类型转换)两种数据类型之间的转换需要进行显式的声明。
数据类型不兼容或者由精度低(或者范围小)的数据类型向精度高(或者范围大)的数据类型的变量赋值时自动类型转换无法进行,要求进行强制类型转换
强制类型转换可能会造成精度损失
long d1 = 100.23;
int d2 = (int)d1;//进行强制类型转换,但是损失了精度 丢掉了小数点后数据
变量的作用域
变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域。
作用域判断有个比较简单的方法
- 首先找到该成员所在的最内层的朝左和朝右的括号
- 再找到该成员声明变量的位置,这里是它开始的地方
- 再找到该成员所在的最内层的朝左的括号,这里是它结束的地方
public class HelloWorld {
public static void main(String[] args) {
int age = 18;//定义变量 作用域的开始的地方
System.out.println(String.format("age = %d", age));
//作用域的结束的地方
}
}
运算符
算数运算符
算数运算符是用于对两个数值或者数值类型的变量进行运算
- +
int value = 32 + 23;
- -
int value = 32 - 23;
- *
int value = 32 * 23;
- /
int value = 32 / 23;//此时value的值为1
/*注意 当按照我们平时的计算方法时它的结果应该是一个小数
而Java编译器并不会认为它是一个小数 而是只采用它的整数部分*/
- % 取模 就是小学的取余数
int value = 3 % 2;//3 / 2 商1余1
- ++ 自加 有两种形式 一种是++操作数 另一种是操作数++
int value = 2;
System.out.println(++value); //先运算(2 + 1) 后作为表达式(3)
System.out.println(value++); //先作为表达式(3) 后运算(3 + 1)
//输出为 3 3
- -- 自减 与自加类似
int value = 2;
System.out.println(--value); //先运算(2 - 1) 后作为表达式(1)
System.out.println(value--); //先作为表达式(1) 后运算(1 - 1)
//输出为 1 1
表达式类型自动提升
变量再表达式中进行运算时,有可能发生自动类型转换,这就是表达式数据类型的自动提升
byte b1 = 0x0a, b2 = 0x01, b3;
b3 = (byte) (b1 + b2);//数据类型自动提升
//表达式b1 + b2 在运算时自动转换为int类型
//但是int类型变量无法自动地转换为int类型 需要进行强制类型转换
System.out.println(String.format("b1 = %d b2 = %d b3 = %d", b1, b2, b3));
赋值运算符
将常量、变量或表达式的值赋给某一个变量
- =
int a = 32;
/*将右操作数(值32)复制到左操作数(标识符为a的内存单元) 这个过程称为赋值
‘=’为赋值运算符 不是数学上的相等的含义
左操作数要求是可以改变的,也就是变量
右操作数可以是变量,也可以是常量或者是表达式
*/
- +=
int a = 1;
a += 2;//与a = a + 2;作用相同 是一个缩写形式 下同
- -=
- *=
- /=
- %=
比较运算符
对两个数值或者变量进行比较,其结果是一个布尔值
- == 相等 两者相同结果为true,否则为false
boolean b1 = true == false; //结果为false
boolean b2 = 1 == 1; //结果为true
boolean b3 = false;
boolean b4 = b1 == b1; //结果为true
- != 不相等 两者不相同结果为true,否则为false
boolean b1 = true != false; //结果为true
boolean b2 = 1 != 1; //结果为false
boolean b3 = false;
boolean b4 = b1 != b1; //结果为false
- < 左操作数小于右操作数,结果为布尔值
int num1 = 100,num2 = 99;
boolean b1,b2,b3;
b1 = num1 < num2;//结果为false
b2 = 3 < 4;//结果为true
b3 = num1 < 1;//结果为false
- > 左操作数大于右操作数,结果为布尔值
int num1 = 100,num2 = 99;
boolean b1,b2,b3;
b1 = num1 > num2;//结果为true
b2 = 3 > 4;//结果为false
b3 = num1 > 1;//结果为true
- >= 左操作数大于或者等于右操作数,结果为布尔值
int num1 = 100,num2 = 99;
boolean b1,b2,b3;
b1 = num1 >= num2;//结果为true
b2 = 3 >= 3;//结果为true
b3 = num1 >= 1;//结果为true
- <= 左操作数小于或者等于右操作数,结果为布尔值
int num1 = 100,num2 = 99;
boolean b1,b2,b3;
b1 = num1 <= num2;//结果为false
b2 = 3 <= 3;//结果为true
b3 = num1 <= 1;//结果为false
逻辑运算符
用于对布尔型的数据进行操作,其结果是一个布尔值
- & 与 两者为真则为真
boolean b;
b = true & true;
System.out.println(b);//true
b = false & true;
System.out.println(b);//false
b = false & false;
System.out.println(b);//false
- | 或 一真则真
boolean b;
b = true | true;
System.out.println(b);//true
b = false | true;
System.out.println(b);//true
b = false | false;
System.out.println(b);//false
- ^ 异或 两者相同则为假,否则为真
boolean b;
b = true ^ true;
System.out.println(b);//false
b = false ^ true;
System.out.println(b);//true
b = false ^ false;
System.out.println(b);//false
- ! 非 取反
boolean b;
b = !true;
System.out.println(b);//false
b = !false;
System.out.println(b);//true
- && 短路与 当左操作数为假时不再对右操作数进行检查
boolean b;
int num1 = 1, num2 = 2;
b = (num1 == 0) & (++num2 == 3);// 不论左操作数是否为假都对右操作数进行计算
System.out.println(String.format("num1 = %d num2 = %d %b", num1, num2, b));
b = (num1 == 0) && (++num2 == 3);// 短路与左操作数为假没有对右操作数进行计算
System.out.println(String.format("num1 = %d num2 = %d %b", num1, num2, b));
System.out.println("==================================");
num1 = 1;
num2 = 2;
b = (num1 == 1) & (++num2 == 3);// 左操作数为真对右操作数进行计算
System.out.println(String.format("num1 = %d num2 = %d %b", num1, num2, b));
b = (num1 == 1) && (++num2 == 3);// 左操作数为真对右操作数进行计算
System.out.println(String.format("num1 = %d num2 = %d %b", num1, num2, b));
/*
输出
num1 = 1 num2 =3 false
num1 = 1 num2 =3 false
==================================
num1 = 1 num2 =3 true
num1 = 1 num2 =4 false
*/
- || 短路或 当左操作数为真时不再对右操作数进行检查
boolean b;
int num1 = 1, num2 = 2;
b = (num1 == 0) | (++num2 == 3);// 不论左操作数是否为真都对右操作数进行计算
System.out.println(String.format("num1 = %d num2 = %d %b", num1, num2, b));
b = (num1 == 0) || (++num2 == 3);// 短路或 左操作数为真不对右操作数进行计算
System.out.println(String.format("num1 = %d num2 = %d %b", num1, num2, b));
/*
num1 = 1 num2 = 3 true
num1 = 1 num2 = 4 false
*/
运算符的优先级
在对一些比较复杂的表达式进行计算时,运算符参与运算的先后顺序称为运算符的优先级
数字越小优先级越高
并不推荐使用复杂的表达式,推荐将复杂问题通过分步骤或者加括号的办法将表达式简单化,所以运算符的优先级在入门阶段并不要求熟记,了解即可
- . [] ()
- ++ -- ~ ~
- * / %
- + -
- << >> >>>
- < > <= >=
- == !=
- &
- ^
- |
- &&
- ||
- ?:
- = *= /= %= += -= <<= >>= >>>= &= ^= |=
ByJuston

浙公网安备 33010602011771号