第02章-变量与运算符

目录

1 关键字

 2 标识符

3 变量

4 数据类型

表数范围计算公式

整型

 浮点型

 字符型

布尔型

5 数据类型之间的转换

自动类型提升

 强制类型转换

6 基本数据类型与String类型转换 

7 进制运算 

进制的分类

进制的转换

 8 运算符

算术运算符

赋值运算符 

 关系运算符

 逻辑运算符

三元运算符 

位运算符

位运算

位运算符

 运算符优先级


1 关键字

关键字被Java语言赋予了特殊含义,用作专门用途的字符串(或单词)。如classpublicstaticvoid等,这些单词都被Java定义好了,称为关键字。

 2 标识符

标识符:Java中变量、方法、类等要素命名时使用的字符序列,称为标识符。简单的说凡是可以自己命名的地方法都是标识符,如类名、方法名、变量名等等。

标识符命名规则必须遵守,不遵守会报错

  • 由26个英文字母大小写,0-9,_或$组成;
  • 不能包含空格,不能以数字开头;
  • 不能与关键字或保留字相同;
  • 严格区分大小写,长度不限;
  • 定义标识符时要“见名知意”。

标识符命名规范建议遵守,不遵守也可以,但遵守了显得更专业

  • 包名:多单词组成时所有字母都小写:xxxyyyzzz。如java.lang
  • 类名、接口名:多单词组成时所有字母的首字母大写:XxxYyyZzz。如Hello
  • 变量名、方法名:多单词组成时第一个单子首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz。如bookName
  • 常量名:所有字母都大写,多单词组成时每个单词之间用下划线链接:XXX_YYY_ZZZ。如MAX_VALUE

3 变量

变量:内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化。

  • 变量三要素:数据类型变量名存储的值
  • Java中变量声明的格式:数据类型 变量名 = 变量值;
  • 变量的作用:在内存中保存数据
  • 变量都有作用域,只在作用域内生效,同一作用域内变量不能重名
class VariableTest{
	public static void main(String[] args) {
		//变量的声明
		//分步式:先声明,再初始化
		char gender;
		gender = '男';
		//一步式:声明同时初始化
		int age = 18;
        //变量的使用,直接调用变量名
		System.out.println(gender+""+age);
	}
}

4 数据类型

表数范围计算公式

整型

  • 整数类型包括byteshortintlong
  • 注意:

        1. 声明整型变量时遵守保小不保大,数据类型能小则小;

        2. 整型常量默认为int占用空间更小,声明long型常量须后加lL

  • 各整数类型有固定的表数范围和占用存储空间: 

 浮点型

  • 整数类型包括floatdouble
  • float:单精度,尾数可以精确到7位有效数字;
  • double:双精度,精度是float的两倍;
  • 注意: 浮点型型常量默认为double精度更高,声明float型常量须后加fF
  • 浮点型表数范围和占用空间:

  • 浮点型常量的两种表示形式:
  1. 十进制形式。如5.12 512.0f .512(必须有小数点)
  2. 科学计数法形式。如5.12e2 512E2 100E-2

 关于浮点型精度的说明: 

  1. 不是所有小数都可以精确的使用二进制浮点数表示。二进制浮点不能精确的表示0.1、0.01、0.001这样10的负次幂。
  2. 浮点型float、double的数据不适合在不容许舍入误差的金融计算领域,如果需要精确数字计算或保留指定位数的精度,需要使用BigDecimal类
  3. 浮点在机器中存放的形式,浮点数=符号位+指数位+尾数位。浮点数float超出存储空间的值会被丢掉
  4. 演示:
// 1.float精度不高,超出存储范围的部分会被丢掉
float num1 = 2.1234567851f;
double num2 = 2.1234567851f;
System.out.println("float=" + num1 + "\ndouble=" + num2);
// 2.二进制浮点数不能准确的表示0.1、0.01、0.001等10的负次幂的数
System.out.println(0.1 + 0.2);
// 3.浮点型使用陷阱
double num3= 2.7;
double num4=8.1/3;
System.out.println(num3 == num4);
float  f1 = 123123123f;
float f2 = f1+1;
System.out.println(f1);
System.out.println(f2);
System.out.println(f1== f2);

应用案例:

案例1:定义圆周率并赋值为3.14,现在3个圆的半径分别为1.2、2.5、6,求他们的面积

/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/26-0:34
 * @description 定义圆周率并赋值为3.14,现在3个圆的半径分别为1.2、2.5、6,求他们的面积
 */
public class FloatDoubleExer {
    public static void main(String[] args) {
        double PI = 3.14; //圆周率

        double radius1 = 1.2;
        double radius2 = 2.5;
        double radius3 = 6;

        System.out.println("第1个圆的面积=" + PI * radius1 * radius1);
        System.out.println("第2个圆的面积=" + PI * radius2 * radius2);
        System.out.println("第3个圆的面积=" + PI * radius3 * radius3);
    }
}

 案例2:将华氏温度转为摄氏温度(℃):℃=(℉ - 32) / 1.8

/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/26
 * 将华氏温度转为摄氏温度(℃):℃=(℉ - 32) /1.8
 */
public class FloatDoubleExer02 {
    public static void main(String[] args) {
        double hua = 80.0;
        double she = (hua-32)/1.8;
        System.out.println("华氏度"+hua+"℉=摄氏度"+she+"℃");
    }
}

 字符型

  • char类型数据用来表示通常意义上“字符”(占2字节)
  • 字符型变量的三种表现形式:
  1. 形式1:使用单引号('')括起来的单个字符。如:char c1 = 'a'; char c2 = '男'; char c3 = 9;
  2. 形式2:直接使用Unicode值来表示字符常量:‘\uXXXX’。其中,XXXX表示一个十六进制整数。如:\u0023 表示'#'。
  3. Java中还允许使用转义字符'\',来将其后的字符转变为特殊字符型常量。如:char c4 = '\n';,'\n'表示换行符
  4. char类型是可以进行运算的,它都对应有Unicode码,可以看作是一个数值,ASCII码值。
  • 演示:
/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/26
 */
public class CharBooleanTest {
    public static void main(String[] args) {
        //1.字符类型 char(2字节)
        //2.表示形式
        //2.1 使用单引号('')括起来的单个字符
        char c1 = 'a';
        char c2 = '1';
        char c3 = '男';
        char c4 = '@';
        //2.2 直接使用Unicode值来表示字符常量:'\'uXXXX'。其中,XXXX表示一个十六进制整数。
        char c5 = '\u0036'; //表示后买你
        System.out.println(c5);
        //2.3使用转义字符'\',来将其后的字符转变为特殊字符型常量。
        char c6 = '\n';
        //2.4char类型是可以进行运算的,它都对应有Unicode码,可以看作是一个数值,ASCII码值
        char c7 = 97;
        System.out.println(c7);
    }
}

布尔型

  • 布尔类型(boolean),只有两个值true、false;
  • 常用于逻辑条件的判断,如条件判断、分支结构、循环结构等;
  • 演示:

// 布尔类型(boolean) 1字节
// 1.只有两个值true和false
boolean b1 = true;
boolean b2 = false;
// 不能使用0和1代替true和false
// boolean b3 = 0; //编译不通过

// 常用于条件判断或循环语句中
boolean isStudent = true;
if (isStudent){
    System.out.println("是学生");
}else{
    System.out.println("不是学生");
}

5 数据类型之间的转换

自动类型提升

  • 自动类型转换:数据类型表数范围的自动提升
  • 类型转换规则:
    • 容量较小的类型自动转换为容量大的数据类型(容量是指表数范围的大小);
    • byte、short、char之间运算后为int类型;
    • char不能与short、int转换。
  • 演示:
/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/27
 * 演示基本数据类型之间的类型转换
 * 包括:
 *      1.自动 类型转换(数据类型的精度\表数提升)
 *      2.强制 类型转换
 * 类型转换规则:容量是指数据类型(表数范围)的大小
 * 1.容量较小的类型赋值给容量较大的类型时,结果自动转换为容量大的数据类型
 * 	byte ---> short ---> int ---> long ---> float ---> double
 * 2.byte、short char之间运算后为int类型:(特殊情况1)
 *  byte + short ---> int,byte + byte---> int,short + short ---> int
 * 3.char不能与short、int转换(特殊情况2)
 */
public class BasicDataSwitch {
    public static void main(String[] args) {

        // 容量是指表数范围的大小
        // 如long型占8字节,float型占4字节,但是表述范围float更大
        long l1 = 115431543L;
        float f1 = l1;
        float f2 = 2.45465412f;
        //long l2 = f2; // 编译报错

        // byte ---> int  ok
        byte b1 = 1;
        int i1 = b1 + b1;

        // int ---> byte
        //byte b2 = i1 + i1; // 编译报错

        // 特殊情况1:byte + short ---> int
        byte b3 = 11;
        short s1 = 12;
        //short s2 = s1+b3; // 编译报错
        int i2 = s1 + b3;

        //  特殊情况2:char不能与byte、short进行类型转换
        char c1 = 10;
        //byte b4 = c1; // 编译报错
        //short s2 = c1; // 编译报错
    }
}

 强制类型转换

  • 强制类型转换:将取值范围(或容量)大的类型强制转换为取值范围小(或容量小的类型)。
  • 强制类型转换符:"()",在小括号内指定要转换为的数据类型。
  • 强制类型转换可能会导致精度损失。
  • 演示:
/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/28
 * 演示强制类型转换的使用
 * 规则:
 *      1.如果需要将容量大的赋值给容量小的类型,需要进行强制类型转换
 *      2.强制类型转换符:"()",在小括号内指定要转换为的数据类型
 *      3.强制类型转换可能会导致精度损失
 */
public class ForceTypeSwitch {
    public static void main(String[] args) {
        // 自动类型提升 int ---> double
        double d1 = 12;
        // 尝试double ---> int,编译错误
        //int i1 = d1;
        int i2 = (int) d1;
        System.out.println(i2);

        long l1 = 666;
        short s1 = (short) l1;
        System.out.println(l1);

        // 精度损失
        double d2 = 12.3;
        int i3 = (int) d2;
        System.out.println(i3);

        int i4 = 128;
        byte b1 = (byte) i4;
        System.out.println(b1);
    }
}

6 基本数据类型与String类型转换 

  • 基本数据类型-->String类型:使用包装类的parse方法。
  • String类型-->基本数据类型:使用双引号""拼接。
  • 注意:String类型-->基本数据类型时,String数据的格式必须是能够转换的基本数据类型
  • 演示:
/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/28
 * 演示String与基本数据类型之间的转换
 * 1.基本数据类型-->String类型(使用包装类的parse方法)
 * 2.String类型-->基本数据类型(使用双引号""拼接)
 */
public class StringToBasic {
    public static void main(String[] args) {
        // 基本数据类型-->String类型(使用包装类的parse方法)
        int n1 = 100;
        float f1 = 1.1f;
        double d1 = 4.5;
        boolean b1 = true;
        String s1 = n1 + "BasicToString";
        String s2 = f1 + "BasicToString";
        String s3 = d1 + "BasicToString";
        String s4 = b1 + "BasicToString";
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);

        // String类型-->基本数据类型(使用双引号""拼接)
        // 需要通过基本数据的包装类调用parseXX方法
        String byteStr = "127";
        byte b2 = Byte.parseByte(byteStr);
        String shortStr = "123";
        short sh2 = Short.parseShort(shortStr);
        String intStr = "321";
        int int2 = Integer.parseInt(intStr);
        String longStr = "321123321";
        long long2 = Long.parseLong(longStr);
        String floatStr = "12.3";
        float float2 = Float.parseFloat(floatStr);
        String doubleStr = "12.3";
        double double2 = Double.parseDouble(doubleStr);
        //char类型调用charAt(0)方法
        String charStr = "12.3";
        char char2 = charStr.charAt(0);
        String booleanStr = "true";
        boolean boolean2 = Boolean.parseBoolean(booleanStr);
        System.out.println(b2 + " " + sh2 + " " + 
                           int2 + " " + long2 + " " + 
                float2 + " " + double2 + " " + 
                char2 + " " +
                boolean2);
    }
}

7 进制运算 

进制的分类

  • 十进制(decimal)
    • 数字组成:0-9
    • 进位规则:满10进1
  • 二进制(bindary):以0b或0B开头
    • 数字组成:0-1
    • 进位规则:满2进1
  • 八进制(octal):很少使用,以数字0开头
    • 数字组成:0-7
    • 进位规则:满8进1
  • 十六进制(bindary):以0x或0X开头
    • 数字组成:0-9和a-f。a-f不区分大小写
    • 进位规则:满16进1
  • 演示:
/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/28
 * 演示二进制数
 * 用四种进制表示数字20
 */
public class BinaryTest {
    public static void main(String[] args) {
        // 十进制
        int num1 = 20;
        // 二进制
        int num2 = 0b10100;
        // 八进制
        int num3 = 024;
        // 十六进制
        int num4 = 0x14;
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
        System.out.println(num4); 
    }
}

进制的转换

十进制

二进制

八进制

十六进制

1

1

1

1

2

10

2

2

3

11

3

3

4

100

4

4

5

101

5

5

6

110

6

6

7

111

7

7

8

1000

10

8

9

1001

11

9

10

1010

12

a

11

1011

13

b

12

1100

14

c

13

1101

15

d

14

1110

16

e

15

1111

17

f

16

10000

20

10

其它进制转十进制:

  • 二进制转十进制:从最低位(右边)开始,将每一位上的数提取出来,乘以2的(位数-1)次方。位数是指从右边数第几位。如0b1011=1*2^(4-1) + 0*2^(3-1) + 1*2^(2-1) + 1*2^(1-1)
  • 八进制转十进制:从最低位(右边)开始,将每一位上的数提取出来,乘以8的(位数-1)次方。
  • 十六进制转十进制:从最低位(右边)开始,将每一位上的数提取出来,乘以16的(位数-1)次方。

 十进制转其它进制:将十进制连续除以其它进制数,直到商为0,取每步的余数倒置就是对应的进制数。

  • 十进制转二进制:十进制数连续除以2,直到商为0,取每步的余数倒置
  • 十进制转八进制:十进制数连续除以8,直到商为0,取每步的余数倒置
  • 十进制转十六进制:十进制数连续除以16,直到商为0,取每步的余数倒置

二进制转八、十六进制:

  • 二进制转八进制:将二进制数的每3位为一组(从右开始个位数的值分别是421),每一组对应转换为一个8进制数。
  • 二进制转十六进制:将十六进制的每4位为一组(从右开始个位数的值分别是8421),每一组对应转换为一个16进制数。

 8 运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等等。

运算符的分类:算术运算符、赋值运算符、比较(或关系)运算符、逻辑运算符、位运算符、条件运算符、Lambda运算符。

分类

运算符

算术运算符(7个)

+  -  *  /  %  ++  --

赋值运算符(12个)

=  +=  -=  *=  /=  %=  >>=  <<=  >>>=  &=  |=  ^=

比较(或关系)运算符(6个)

>  >=  <  <=  ==  !=

逻辑运算符(6个)

&  |  ^  !  &&  ||

位运算符(7个)

&  |  ^  -  <<  >>  >>>

条件运算符(1个)三元运算符

条件表达式?表达式1:表达式2;

Lambda运算符(1个)

->(Java新特性章节讲解)

算术运算符

运算符

功能

范例

结果

+

正号

+3

3

-

负号

b=4; -b;

-4

+

5+5

10

-

6-4

2

*

3*4

12

/

5/5

1

%

取模(取余)

7%5

2

++i

自增(前):先自增,后赋值

a=2;b=++a;

a=3;b=3

i++

自增(后):先赋值,后自增

a=2;b=a++

a=3;b=2

--i

自减(前):先自减,后赋值

a=2;b=--a

a=1;b=1

i--

自减(后):先赋值,后自减

a=2;b=a--

a=1;b=2

+

字符串拼接

"Hello"+"world"

"Helloworld"

赋值运算符 

赋值运算符是将某个运算后的值赋给指定的变量。

  • 基本赋值运算符:"=",如int n = 1;;
    • 当"="两边数据类型不一致时,可以使用自动类型提升或强制类型转换进行处理;
  • 复合赋值运算符:+=、-+、*=、/=、%=,如n += 3;等价于n = n + 3;;
    • 注意:复合赋值运算符会进行类型转换,底层具有强制类型转换符。
  • 演示:
/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/28
 * 演示赋值运算符
 */
public class SetValueTest {
    public static void main(String[] args) {

        int n = 10;
        // 1.当"`=`"两边数据类型不一致时,可以使用`自动类型提升`或`强制类型转换`进行处理
        long l1 = n; // 自动类型提升
        byte b1 = (byte) n; // 强制类型转换
        // 2.允许连续赋值
        int a, b;
        a = b = 100;
        // 3.复合赋值运算符会进行`类型转换`,底层具有`强制类型转换符`
        byte n1 = 12;
        n1 += 3; // 等价于n1=(byte)(n1+3),强制类型转换为int
        System.out.println(n1);
    }
}
  • 练习1:
int n = 10;
n += (n++) + (++n); // 等价于n = n + (n++) + (++n)
// num = 10 + 10 + 12,先计算n++和++n
System.out.println(n);

 关系运算符

关系运算符的结果都是boolean类型truefalse

  • 关系运算符:>>=<<===!=
  • ==和!=适用于基本数据类型和引用数据类型,其它只适用于基本数据类型;
  • 注意:=是赋值运算符,==是关系运算符

运算符

功能

范例

结果

==

等于

8 == 7

false

!=

不等于

8 != 7

true

>

大于

8 > 7

true

>=

大于等于

8 >= 7

true

<

小于

8 < 7

false

<=

小于等于

8 <= 7

false

A instanceof B

检测A是否为B类的对象

"ahhlt" instanceof String

true

 逻辑运算符

逻辑运算符只对boolean类型进行操作,结果也是boolean类型的值。

运算符

功能

&&&

表示""关系,符号两边同时为true时,结果为true。助记:同1为1,1为true,0为fasle

|||

表示""关系,符号两边只要有一个为true,结果为true。助记:有1为1

!

表示""关系,变量的值为true时,结果为false。助记:取反

^

表示"异或"关系,符号两边的值不同时,结果为true。助记:有同为0,不同为1

 逻辑运算与短路运算的区别:

  • 短路与(&&)和逻辑与(&):
    • 短路与(&&):条件1 && 条件2,若条件1为false,则不再判断条件2。
    • 逻辑与(&):条件1 & 条件2,若条件1为false,继续判断条件2。
    • 注意:开发中一般使用短路与,除非特定情况才使用逻辑与。
  • 短路或(||)和逻辑或(|):
    • 短路或(||):条件1 || 条件2,若条件1为true,则不再判断条件2。
    • 逻辑或(|):条件1 | 条件2,若条件1为true,继续判断条件2。

三元运算符 

  • 语法格式:(条件表达式)?表达式1:表达式2
  • 运算规则:如果条件表达式的值为true,运算结果为表达式1,否则为表达式2
  • 表达式1和表达式2必须是可以赋给接收变量的类型(可以自动转换或语法强转)
/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/28
 * 条件表达式的使用
 */
public class ConditionTest {
    public static void main(String[] args) {
        int a = 10;
        int b = 99;
        int result = (a > b) ? a++ : b--;
        // a > b为false,返回第二个表达式b--,先将b的值返回,b再自减
        System.out.println("result= " + result);
        System.out.println("b= " + b);
        // 表达式类型与接收变量类型不同时,必须满足类型自动转换或者强制转换
        int c = a > b ? (int)1.1 : (int)2.2;
    }
}

位运算符

位运算

  • 计算机进行运算时,都是对补码进行运算,显示运算结果时将计算后的补码转为原码;
  • 正数的原码、反码、补码都相同,称三码合一
  • 负数的三码:
    • 反码:原码除符号位不变,其它位取反
    • 补码:反码+1。相应的:负数的反码= 补码-1
    • 符号位:二进制的最高位(最左边)为符号位,0代表正数,1代表负数

位运算符

二进制补码进行运算

运算符

功能

&

按位与,全1为1

|

按位或,有1为1

^

按位异或,不同为1,相同为0

~

按位取反,每位都取相反值

<<

左移,符号位不变,低位补0。左移n位相当于乘2的n次方

>>

右移,符号位不变,用符号位补高位空缺。右移n位相当于除2的n次方

>>>

无符号右移,低位溢出,高位补0

演示:

/**
 * @author shbzhao
 * @version 1.0
 * @date 2023/8/28
 */
public class BitOperatorTest {
    public static void main(String[] args) {
        /*
         * 1.按位与(&):2 & 3
         * 正数的原码、反码、补码都相同
         * 2的三码:00000000 00000000 00000000 00000010
         * 3的三码:00000000 00000000 00000000 00000011
         * 2 & 3: 00000000 00000000 00000000 00000010
         * 结果为2
         *
         * 2.按位或(&):
         * */
        System.out.println(2 & 3);
    }
}

 运算符优先级

优先级

运算符说明

Java运算符

1

括号

()、[]、{}

2

正负号

+、-

3

单元运算符

++、--、~、!

4

乘、除、取余

*、/、%

5

加、减

+、-

6

位移运算符

<<、>>、>>>

7

关系运算符

>、>=、<、<=、==、!=、instanceof

8

按位与

&

9

按位异或

^

10

按位或

|

11

短路与

&&

12

短路或

||

13

三元运算符

条件表达式?表达式1:表达式2;

14

赋值运算符

=、+=、-=、*=、/=、%=、>>=、<<=、>>>=、&=、|=、^=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值