【Java入门】变量与运算符

变量

定义

程序运行其中会产生一些临时数据,应用程序将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。

这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。

数据类型

Java是一门强类型的编程语言,对变量的数据类型有着强制的限定。

Java中,变量的数据类型笼统的可以分为基本数据类型和引用数据类型。

  • 基本数据类型
  1. 数值型

    1. 整形
    • 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
    1. 浮点型
    • 单精度浮点数 float 4字节 -3.40E+38 ~ +3.40E+38
    • 双精度浮点数 double 8 4字节 -1.79E+308 ~ +1.79E+308
  2. 字符型 char 0 ~ 65535 每个数字都对应一个字符

  3. 布尔型 boolean true false

  • 引用数据类型
  1. 类 class
  2. 接口 interface
  3. 数组
  4. 枚举 enum
  5. 注解 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;//进行强制类型转换,但是损失了精度 丢掉了小数点后数据

变量的作用域

变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域。

作用域判断有个比较简单的方法

  1. 首先找到该成员所在的最内层的朝左和朝右的括号
  2. 再找到该成员声明变量的位置,这里是它开始的地方
  3. 再找到该成员所在的最内层的朝左的括号,这里是它结束的地方
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
*/

运算符的优先级

在对一些比较复杂的表达式进行计算时,运算符参与运算的先后顺序称为运算符的优先级

数字越小优先级越高

并不推荐使用复杂的表达式,推荐将复杂问题通过分步骤或者加括号的办法将表达式简单化,所以运算符的优先级在入门阶段并不要求熟记,了解即可

  1. . [] ()
  2. ++ -- ~ ~
  3. * / %
  4. + -
  5. << >> >>>
  6. < > <= >=
  7. == !=
  8. &
  9. ^
  10. |
  11. &&
  12. ||
  13. ?:
  14. = *= /= %= += -= <<= >>= >>>= &= ^= |=

ByJuston

posted @ 2020-02-05 23:26  JustonTao  阅读(159)  评论(0)    收藏  举报