第2章:Java基本语法(变量和运算符)


时间:2018-07-16 作者:魏文应


一、关键字

Java 目前使用到的关键字:

  • 第2章:Java基本语法(变量和运算符)_第1张图片
    java关键字

保留字,就是现有Java版本尚未使用,但以后版本可能会作为关键字使用:

byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const

二、标识符

类、变量、方法等所命名的名称,这个名称就叫 标识符。也就是说,凡是自己可以起名字的地方都叫标识符。定义规则:

  • 由26个英文字母大小写,0-9 ,_或 $ 组成
  • 数字不可以开头。
  • 不可以使用关键字和保留字,但能包含关键字和保留字。
  • Java中严格区分大小写,长度无限制。
  • 标识符不能包含空格。

注意:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。

三、变量

先定义,后使用:

class Veriable{
    public static void main(String[] args){
        int myInt = 10;
        double myDouble = 12.3;
        
        System.out.println(myInt);
        System.out.println(myInt + myDouble);
    }
}

变量数据类型

对于每一种数据都定义了 明确的 具体数据类型,在内存中分配了 不同大小 的内存空间:

  • 第2章:Java基本语法(变量和运算符)_第2张图片
    数据类型

变量的表数范围

不同的数据类型,能够表示的数据范围是不一样的。Java 的表数范围和字段长度是 固定不变的,不受 操作系统OS 影响:

数据类型 占用存储空间大小 表数范围
byte 1字节(8bit) -128~127
short 2字节 (-2^15) ~ (2^15 -1)
int 4字节 (-2^31) ~ (2^31 - 1)
long 8字节 (-2^63) ~ (2^63 - 1)
float 4字节 -3.403E38 ~ 3.403E38
double 8字节 -1.798E308 ~ 1.798E308
字符类型 占用存储空间大小 字段长度
char 2字节 单字符(一个中文、英文、日文等等)

如果要表示一个 字符串,需要用字符串类 String :

String str = "中国"

在声明数据类型时,我们要注意:

  • 声明 long 数据类型,要在其后面加上 L 或者 l

    // 范围不超时,不加 L 不会报错
    long myName = 123423L;
    
  • 声明 float 数据类型,要在其后面加上 F 或者 f

    // 不加 F 会报错,必须加 F
    float myName = 12.43F;
    

另外,还有一个 布尔数据类型boolean。 它只能取值 trueflase 。和C语言不一样,Java中 不能0 表示 flase,用 非0 表示 true 。

变量类型自动转换。

变量自动类型转换,由编译器自动完成。当容量小的类型和容量大的类型运算时,容量小的自动转化为容量大的类型:

char、byte、short ===> int ===> long ===> float ===> double

byte、char、short 运算中,其运算结果,不能赋值给 byte、char、short 类型的变量,应该赋值给int类型的变量。

运算类型组合 运算类型组合 运算类型组合
byte + byte byte + short byte + char
char + char char + byte char + short
short + short short + byte short + char

比如下面代码编译就会报错:

class TestVeriable{
    public static void main(String[] args){
        char myChar1 = 127;
        char myChar2 = 127;
        // 正确的应该这样:int myChar3 = myChar1 + myChar2;
        char myChar3 = myChar1 + myChar2;
        System.out.println(myChar3);
    }
}
  • 编译报错

int 类型中,将 两个 int 类型的数相加,相加得到的和,赋值给一个 int 类型。虽然这中操作是 被编译器允许的,但要注意 数据可能溢出

class TestVeriable{
    public static void main(String[] args){
        int myInt1 = 2147483647;
        int myInt2 = 2147483647;
        int myInt3 = myInt1 + myInt2;
        System.out.println(myInt3);
    }
}

上面 TestVeriable.java 源文件中,int 最大可以存储的值为 2147483647 , 相加之后,超出了 int 所能存储的最大值,运行没有报错,但 结果是错误的

  • 相加结果溢出

和 int 类型一样,在类似于 变量1 = 变量2 + 变量3 这样的表达式中,允许这三个变量 均为同一数据类型 的还有: long、float、double 。

强制类型转换

容量大的数据类型,转换为容量小的数据类型,这时就是 强制类型转换 。比如:

class TestVeriable{
    public static void main(String[] args){
        int  tmp1 = 1111;
        byte tmp2 = (byte)tmp1;
        System.out.println(tmp2);
    }
}

注意:强制类型转换,会导致数据精度的损失。 比如上面的输出结果,就不是 1111 ,而是:

  • 精度损失输出结果

String 字符串运算

只能是连接运算,得到的结果仍为一个字符串:

class TestVeriable{
    public static void main(String[] args){
        int tmp1 = 123456;
        String tmp2 = "Hello World!";
        System.out.println(tmp2 + tmp1);
    }
}

连接符 + 运算要注意:'a' + 'b'会得到一个数(+号这时是相加),"a" + "b" 得到 ab(+号这时是连接符):

class TestVeriable{
    public static void main(String[] args){
        System.out.println('a' + 'b');
        System.out.println("a" + "b");
    }
}
  • 连接符测试结果

四、进 制

和C语言一样,Java编程中,常用的有以下进制:

  • 二进制:0b 或者 0B 开头 的数字,比如: 0b11, 0b10 等。

  • 十进制: 源代码中,正常的数字表示就是十进制,比如:1, 2, 3 等。

  • 十六进制:0x 或者 0X 开头 的数字,比如:0x11, 0xF1 等。

  • 八进制:0 开头 的数字,比如 01, 07 等。

五、运算符

运算符 代表的意义
+ - * / 加、减、乘、除
++ -- 自加1、自减1
% 取模(就是求余数)
+ 加号还可以表示 连接符
= 赋值运算符
-= += *= /= %= 扩展赋值运算
比较运算符 代表的意义
> < == 大于、 小于、相等于
>= <= != 大于等于、 小于等于、不等于
instanceof 检查是否是某个类对象,比如: "Hellow" instanceof String
逻辑运算符 代表的意义
& | ! ^ 逻辑与、逻辑或、逻辑非、逻辑异或
&& || 短路与、短路或
  • 第2章:Java基本语法(变量和运算符)_第3张图片
    逻辑运算符

如果判断两边 不是布尔型逻辑判断,而是 数值运算,那么将是 位运算

位运算符 代表的意义 示例
<< 左移(右侧补0) 31左移3位: 31 << 3
>> 有符号右移(负数时左侧补1) 31有符号右移3位: 31 >> 3
>>> 无符号右移(左侧补0) 31无符号右移3位: 31 >>> 3
& | 按位与、按位或 5 & 15 | 1
^ 按位异或 5 ^ 1
~ 按位取反 ~5

前 ++ 和后 ++

前 ++,先自加1,后运算。比如下面的,tmp 先自加1,再赋值运算给tmp2:

tmp2 = ++tmp;

后 ++ ,先运算,后自加1。比如下面的,tmp 先赋值给tmp2,然后tmp自加1:

tmp2 = tmp++;

逻辑 & 和短路 &&

逻辑& 和短路 && 的逻辑关系是一样的,我们通过下面代码示例,说明 不一样的 地方:

class TestVeriable{
    public static void main(String[] args){
        int tmp = 10;
        boolean b = false;
        
        if(b & (tmp++) > 0){
                System.out.println("这是false");
        }else{
            System.out.println("这是true");
        }
        System.out.println(tmp);
        
        tmp = 10;
        if(b && (tmp++) > 0){
                System.out.println("这是false");
        }else{
            System.out.println("这是true");
        }
        System.out.println(tmp);
    }
}

示例中 b & (tmp++) > 0,如果 b 是 false,依然还要去运行并判断 (tmp++) > 0 。如果是 b && (tmp++) > 0 , b 是 false 的情况下,后面的 (tmp++) > 0 语句将不再去判断执行。同样的情况,在 逻辑 | 和短路 || 也是一样的。

左移或者右移实现乘法运算

如果 31 << 3,其结果相当于 31 * 2 * 2* 2 。当然左移太多,会导致溢出,比如 31 << 32 右移32位就变成了0。

有符号右移 >> 和 无符号右移 >>>

如果是正数时,有符号右移 和 无符号右移 是一样的左侧均补0 。如果是 负数 右移,有符号右移 右侧补1、无符号右移 右侧补0

class TestVeriable{
    public static void main(String[] args){
        System.out.println(15 >> 2);
        System.out.println(15 >>> 2);
        System.out.println(-15 >> 2);
        System.out.println(-15 >>> 2);
    }
}

也就是说:除了负数的有符号右移,右侧补1,其它左右移都补0。

六、三元运算符

三元运算符:(条件表达式) ? 表达式1 : 表达式2; 。如果条件表达式 成立,执行表达式1,否则,执行表达式2。

class TestVeriable{
    public static void main(String[] args){
        int m = 12;
        int n = 5;
        
        int max = (m > n) ? m : n;      
        System.out.println(max);
    }
}

你可能感兴趣的:(第2章:Java基本语法(变量和运算符))