[JavaSE] 第二章 基本语法

2.1 Java 基本语法

2.1.1 注释

Java 中的注释有三种类型,具体如下:

  • 单行注释

    int age = 18;//这是一个单行注释
    
  • 多行注释

    /*
     * 这是一个多行注释
     */
    int age = 18;
    
  • 文档注释

    /**
     * 这是文档注释
     *
     */
    

    生成文档注释命令

    • javadoc -d 目录名 -author -version Java文件名.java -encoding UTF-8 -charset UTF-8

2.1.2 标识符

  • 标识符
    • Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符
    • 技巧:凡是自己可以起名字的地方都叫标识符
  • 定义合法标识符规则
    • 由 26 个英文字母大小写,0-9,_ 或 $ 组成
    • 数字不可以开头
    • 不可以使用关键字和保留字,但能包含
    • Java 中严格区分大小写,长度无限制
    • 标识符不能包含空格
  • 命名规范
    • 包名:多单词组成时所有的字母都小写 xxxyyyyzzz
    • 类名、接口名:多单词组成时,所有单词的首字母大写 XxxYyyZzz
    • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词的首字母大写 xxxYyyZzz
    • 常量名:所有字母都大写。多单词时每个单词都用下划线连接 XXX_YYY_ZZZ
    • 命名的时候尽量见名知意

2.1.3 关键字

  • 关键字的定义和特点:
    • 定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串
    • 特点:关键字中所有的字母都为小写
用于定义关键数据类型的关键字
class interface enum byte
short int float long
double char boolean void
用于定义流程控制的关键字
if else switch case
default while do for
break continue return
用于定义访问权限修饰符的关键字
private protected public
用于定义类,函数,变量修饰符的关键字
abstract final static synchronized
用于定义类与类之间关系的关键字
extends implements
用于定义建立实例及引用实例,判断实例的关键字
new this super instanceof
用于异常处理的关键字
try catch finally throw throws
用于包的关键字
package import
其他修饰符关键字
native strictfp transient volatile assert
用于定义数据类型值的字面值
true false null
  • 保留字
    • 定义:现有 Java 版本尚未使用
    • goto、const

2.1.4 常量

  • 常量就是在程序中固定不变的值,是不能改变的数据。

2.2 变量

2.2.1 变量的定义

  • 变量的概念
    • 内存中的一个存储区域
    • 该区域的数据可以在同一类型范围内不断变化
    • 变量是程序中最基本的储存单元。包含变量类型、变量名和存储的值
  • 变量的作用
    • 用于在内存中保存数据
  • 使用变量注意
    • Java 中每个变量必须先声明,后使用
    • 使用变量名来访问这块区域的数据
    • 变量的作用域:其定义所在的一对 {} 内
    • 变量只有在其作用域内才有效
    • 同一作用域内,不能定义重名的变量
  • 在方法体外,类体内声明的变量称为成员变量
  • 在方法体内部声明的变量称为局部变量

2.2.2 变量的数据类型

[JavaSE] 第二章 基本语法

类型 占用存储空间 表数范围
byte 1 字节 = 8bit 位 -128 ~ 127
short 2 字节 -215 ~ 215 -1
int 4 字节 -231 ~ 231 -1 (约21亿)
long 8 字节 -263 ~ 263 -1
单精度 float 4 字节 -3.403E38 ~ 3.403E38
双精度 double 8 字节 -1.798E308 ~ 1.798E308
  • Java 的整型常量默认为 int 型,声明 long 型常量须后加 l 或者 L

  • Java 程序中变量通常声明为 int 型,除非不足以表示较大的数才使用 long

  • Java 的浮点型常量默认为 double 型声明 float 型常量,须后加 f 或者 F

  • 转义字符

    转义字符 说明
    \b 退格符
    \n 换行符
    \r 回车符
    \t 制表符
    \" 双引号
    \' 单引号
    \\ 反斜线
  • boolean 类型数据只允许取值 true 和 false,无 null

2.2.3 变量的类型转换

在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式的不同,数据类型转换可分为两种:自动类型转换和强制类型转换。

  • 自动类型转换

    • 当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型
    • byte \ short \ char --> int --> long --> float --> double
    • 特别的:当 byte、char、short 三种类型的变量做运算时,结果为 int 型
  • 强制类型转换

    • 需要使用强转符:()

    • 强制类型转换可能导致精度损失

    • 例:

      byte b1 = 10;
      int i1 = 126;
      byte b2 = (byte) (b1 + i1);
      
      char c1 = 'a';
      short s2 = 10;
      short s3 = (short) (s2 + c1);
      
  • 注意

    • 整型常量,默认为 int 型
    • 浮点型常量,默认为 double 型

2.2.4 变量的作用域

public static void main(String[] args) {
    int x = 12; //变量 x
    {
        int y = 20;
    }
    y = x; //将 x 的值赋给 y,但 y 出了它的作用域
}

2.3 运算符

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

分类:

  • 算数运算符(Arithmetic operator)
  • 赋值运算符(Assignment Operators)
  • 比较运算符(Comparison operator)
  • 逻辑运算符(Logical operator)
  • 位运算符(Bitwise Operators)
  • 三元运算符(Ternary operator)

2.3.1 算数运算符

运算符 运算 范例 结果
+ 正号 +3 3
- 负号 b = 4; -b -4
+ 5+5 10
- 5 - 4 1
* 5 * 2 10
/ 5 / 2 2
% 取模(取余) 5 / 2 1
++ 自增(前):先相加后赋值
自增(后):先赋值后相加
a = 2; b = ++a;
a = 2; b = a++;
a = 3; b = 3;
a = 3; b = 2;
-- 自减(前):先相减后赋值
自减(后):先赋值后相减
a = 2; b = --a;
a = 2; b = a--;
a = 1; b = 1;
a = 1; b = 2;
+ 字符串连接 "Hell" + "o" "Hello"
public class ArithmeticTest {
    public static void main(String[] args) {

        int num1 = 14;
        int num2 = 6;
        int num3 = 5;
        int num4 = -10;
        int num5 = -7;

        //除号:/
        int result1 = num1 / num2;
        System.out.println(result1);  //2

        double result2 = (double) num1 / num2;
        System.out.println(result2);  //2.3333333333333335

        //去余:%
        int result3 = num1 % num3;
        System.out.println(result3);  //4

        double result4 = num4 % num3;
        System.out.println(result4);  //0.0

        double result5 = num4 % num5;
        System.out.println(result5);  //-3.0


        //后 ++:先赋值后相加
        int a1 = 10;
        int a2 = a1++;
        System.out.println("a1 = " + a1 + "\t" + "a2 = " + a2);

        //前 ++:先相加后赋值
        int a3 = 10;
        int a4 = ++a3;
        System.out.println("a3 = " + a3 + "\t" + "a4 = " + a4);
    }
}

/*
练习,随意一个整数,打印出它的个位数,十位数,百位数
 */
public class ArithmeticExercise {

    public static void main(String[] args) {
        int number = 157;

        int singleDigit = number % 10;
        System.out.println("个位数是:" + singleDigit);
        int tenDigits = number / 10 % 10;
        System.out.println("十位数是:" + tenDigits);
        int hundreds = number / 100;
        System.out.println("百位数是:" + hundreds);
    }
}

2.3.2 赋值运算符

public class AssignmentTest {

    public static void main(String[] args) {

        int number1 = 10;
        int number2;
        int number3 = 4;

        number2 = number1;
        System.out.println(number2);

        int result1 = number1-=number3;
        System.out.println(result1); //6

        number1 = 10;
        number3 = 4;
        number1 += number3;
        System.out.println(number1); //14

    }
}

2.3.3 比较运算符

比较运算符的结果是 boolean 类型

运算符 运算 范例 结果
== 相等于 4 == 3 false
!= 不等于 4 != 3 true
< 小于 4 < 3 false
> 大于 4 > 3 true
<= 小于等于 4 <= 3 false
>= 大于等于 4 >= 3 true
instanceof 检查是否是类的对象 "hello" instanceof String true
public class ComparisonTest {
    public static void main(String[] args) {

        int i = 10;
        int j = 12;

        System.out.println(i == j); //false
        System.out.println(i <= j); //true
    }
}

2.3.4 逻辑运算符

  • 区分 & 与 &&

    • 相同点:
      • & 和 && 的运算结果相同
      • 当符号左边是 true 时,二者都会执行符号右边的运算
    • 不同点:
      • 当符号左边是 false 时,& 会继续执行符号右边的运算,&& 则不再执行符号右边的运算
  • 区分 | 和 ||

    • 相同点:
      • | 和 || 的运算结果相同
      • 当符号左边是 false 时,二者都会执行符号右边的运算
    • 不同点:
      • 当符号左边是 true 时,| 会继续执行符号右边的运算,|| 则不再执行符号右边的运算
a b a&b a&&b a|b a||b !a a^b
true true true true true true false false
true false false false true true false true
false ture false false true true true true
false false false false false false true false
public class LogicalTest {

    public static void main(String[] args) {
        //& 和 && 的区别
        boolean b1 = true;
        b1 = false;
        int num1 = 10;
        if (b1 & (num1++ > 0)) {
            System.out.println("true");
        } else {
            System.out.println("false");
        }
        System.out.println("num1 = " + num1); //num1 = 11

        boolean b2 = true;
        b2 = false;
        int num2 = 10;
        if (b2 && (num2++ > 0)) {
            System.out.println("true");
        } else {
            System.out.println("false");
        }
        System.out.println("num2 = " + num2); //num2 = 10

        // | 和 || 的区别
        boolean b3 = true;
        int num3 = 10;
        if (b3 | (num3++ > 0)) {
            System.out.println("true");
        } else {
            System.out.println(false);
        }
        System.out.println("num3 = " + num3); //num3 = 11

        boolean b4 = true;
        int num4 = 10;
        if (b4 || (num4++ > 0)) {
            System.out.println("true");
        } else {
            System.out.println(false);
        }
        System.out.println("num4 = " + num4); //num4 = 10

    }
}

2.3.5 位运算符

  • 位运算是直接对整数的二进制进行的运算
运算符 运算 范例 细节
<< 左移 3 << 2 = 12 --> 3 * 2 * 2 = 12 空位补0,被移除的高位丢弃,空缺位补0。
>> 右移 3 >> 1 = 1 --> 3/2=1 被移位的二进制最高位是0,右移后,空缺位补0;
最高位是1,空缺位补1。
>>> 无符号右移 3 >>> 1 = 1 --> 3/2=1 被移位二进制最高位无论是0或者是1,空缺位都用0补。
& 与运算 6 & 3 = 2 二进制位进行&运算,只有1&1时结果是1,否则是0;
| 或运算 6 | 3 = 7 二进制位进行 | 运算,只有0 | 0时结果时0,否则是1
^ 异或运算 6 ^ 3 = 5 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0
不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1
~ 取反运算 ~6 = -7 正数取反,各二进制码按补码各位取反
负数取反,各二进制码按补码各位取反
/*
1.位运算符操作的都是整形的数据
2. <<:在一定范围内,每向左移 1 位,相当于 * 2
   >>:在一定范围内,每向右移 1 位,相当于 / 2

面试题:最高效方式计算 2 * 8 ? 2 << 3 或 8 << 1
 */
public class BitwiseTest {
    public static void main(String[] args) {
        int i = 21;

        System.out.println("i << 2 = " + (i << 2));
        System.out.println("i << 3 = " + (i << 3));
        System.out.println("i >> 1 = " + (i >> 1));

        int m = 12;
        int n = 5;
        System.out.println("m & n = " + (m & n));
        System.out.println("m | n = " + (m | n));
        System.out.println("m ^ n = " + (m ^ n));

        //练习:交换两个变量的值
        int num1 = 10;
        int num2 = 20;

        //方式一:定义临时变量的方式
        int temp = num1;
        num1 = num2;
        num2 = temp;
        System.out.println(num1 + "\t" + num2);

        //方式二:好处:不用定义临时变量
        //弊端:相加操作可能超出存储范围;有局限性:只能适用于基本数据类型
        num1 += num2;
        num2 = num1 - num2;
        num1 = num1 - num2;
        System.out.println(num1 + "\t" + num2);

        //方式三:使用位运算符
        //有局限性:只能适用于基本数据类型
        num1 = num1 ^ num2;
        num2 = num1 ^ num2;
        num1 = num1 ^ num2;
        System.out.println(num1 + "\t" + num2);

    }
}

2.3.6 三元运算符

/*
三元运算符
1.结构:(条件表达式)? 表达式1 : 表达式2
2.说明
①条件表达式的结果为 boolean 类型
②根据条件表达式真或假,决定执行表达式1或2
 */
public class TernaryTest {
    public static void main(String[] args) {

        //获取两个整数的较大值
        int m = 0;
        int n = 1;
        int x = 2;

        int max = Math.max(m, n);
        int max2 = m > n ? m: n;
        System.out.println(max2);

        String maxStr = m > n ? "m大" : n == m ? "m和n相等": "n大";
        System.out.println(maxStr);

        String str = m == 0 ? "老板":m == 1 ? "经理":"员工";
        System.out.println(str);

        //获取三个数中的最大值
        int n1 = 12;
        int n2 = 11;
        int n3 = 13;

        int maxN = ((n1 > n2 ? n1 : n2) > n3 ? n2 : (n3 > n1 ? n3 : n1));
        System.out.println(maxN);

        int maxN2 = n1 > n2 ? n1 : n2;
        int maxN3 = maxN2 > n3 ? maxN2 : n3;
        System.out.println(maxN3);

    }
}

2.4 选择结构语句

2.4.1 if 条件语句

if 条件语句指的是如果满足某种条件,就执行改分支下的语句

public class IfTest {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入年龄:");
        String myAge = in.next();

        int age = Integer.parseInt(myAge);
        if (age <= 18) {
            System.out.println("禁止进入");
        }

        if (age >= 18) {
            System.out.println("你已成年");
        } else {
            System.out.println("未成年");
        }

        if (age < 0) {
            System.out.println("非法");
        } else if (age < 18) {
            System.out.println("青少年");
        } else if (age < 35) {
            System.out.println("青壮年");
        } else if (age < 60) {
            System.out.println("中年");
        } else {
            System.out.println("老年");
        }
        in.close();
    }
}

2.4.2 switch 条件语句

  • 根据 switch 表达式中的值,依次匹配各个 case 中的常量。一旦匹配成功,则进入相应 case 结构中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他 case 结构中的执行语句,直道遇到 break 关键字或此 switch-case 结构末尾为止
  • break,可以使用在 switch-case 中,表示一旦执行到此关键字,就跳出
  • switch 结构中的表达式,只能是如下的 6种 数据类型之一:byte、short、char、int、枚举类型(JDK5.0)、String 类型(JDK7.0)
  • case 之后只能声明常量。不能声明范围。
  • break 关键字是可选的
  • default:当其他 case 都不满足时则会执行
public class SwitchCaseTest {
    public static void main(String[] args) {

        int number = 2;

        switch (number) {

            case 0:
                System.out.println("zero");
                break;
            case 1:
                System.out.println("one");
                break;
            case 2:
                System.out.println("two");
                break;
            case 3:
                System.out.println("three");
                break;
            default:
                System.out.println("other");
        }
    }
}
public class SwitchCaseTest2 {
    public static void main(String[] args) {

        int score = 78;

        /*
        多个输出的值相同可以进行合并
         */
        switch (score / 10) {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                System.out.println("不及格");
                break;
            case 6:
            case 7:
            case 8:
            case 9:
            case 10:
                System.out.println("及格");
                break;
        }

        //优解
        switch (score / 60) {
            case 0:
                System.out.println("不及格");
            case 1:
                System.out.println("及格");
        }
    }
}

2.5 循环结构语句

2.5.1 while 循环语句

  • while 循环结构的四个要素

    • 初始化条件
    • 循环条件
    • 循环体
    • 迭代条件
  • while 循环的结构

    初始化条件
    while(循环条件){
        循环体
        迭代条件
    }
    //先判断,后执行
    
  • 注意:写 while 循环千万不要丢失了迭代条件,一旦丢失,将会导致死循环

public class WhileTest {
    public static void main(String[] args) {

        //遍历 100 以内的所有偶数
        int i = 1;
        while (i < 101) {
            if (i % 2 == 0) {
                System.out.println(i);
            }
            i++;
        }
    }
}

2.5.2 do...while 循环语句

  • do-while 循环的四个要素

    • 初始化条件
    • 循环条件 --> 是boolean类型
    • 循环体
    • 迭代条件
  • do-while 的结构

    初始化条件
    do {
        循环体
        迭代条件
    } while(循环条件);
    //先执行,后判断条件
    
  • do-while 循环至少会执行一次循环体

public class DoWhileTest {
    public static void main(String[] args) {

        //打印 100 以内的偶数和
        int i = 1;
        int sum = 0;
        int count = 0;

        do {
            if (i % 2 == 0) {
                sum += i;
                count++;
            }
            i++;
        } while (i<101);

        System.out.println("总和为:" + sum);
        System.out.println("个数为:" + count);
    }
}

2.5.3 for 循环语句

  • 语法格式

    for(初始化条件;循环条件;迭代条件){
        循环体
    }
    
  • 使用 for 循环遍历 100 以内的偶数

    public class ForTest {
        public static void main(String[] args) {
    
            for (int i = 0; i < 5; i++) {
                System.out.println("Hello World!");
            }
    
            //例题:遍历 100 以内的偶数,输出所有偶数的和
            int sum = 0;
            int count = 0;
            for (int i = 1; i <= 100; i++) {
                if (i % 2 == 0) {
                    sum += i;
                    count ++;
                    System.out.println(i);
                }
            }
            System.out.println("总和为:" + sum);
            System.out.println("偶数的个数为:" + count);
        }
    }
    
  • 使用 for 循环请求最大公约数和最小公倍数

    public class ForTest3 {
        public static void main(String[] args) {
    
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("请输入数值1:");
            int m = scanner.nextInt();
            System.out.print("请输入数值2:");
            int n = scanner.nextInt();
    
            //获取两个数中的较小值
            int minNum = m >= n ? n: m;
            for (int i = minNum; i > 0; i--) {
                if (m % i == 0 && n % i == 0) {
                    System.out.println(String.format("%d 和 %d 的最大公约数是:%d", m,n,i));
                    break;
                }
            }
    
            int maxNum = m >= n ? m: n;
            for (int i = maxNum; i <= m * n; i++) {
                if (i % m == 0 && i % n == 0) {
                    System.out.println(String.format("%d 和 %d 的最小公倍数是:%d", m,n,i));
                    break;
                }
            }
        }
    }
    

2.5.4 循环嵌套

  • 使用 for 循环打印九九乘法表

    public class NineNineTable {
        public static void main(String[] args) {
    
            for (int i = 1; i <= 9; i++) {
                for (int j = 1; j <= i; j++) {
                    System.out.print(j + "*" + i + "=" + i * j + "\t");
                }
                System.out.println();
            }
        }
    }
    
  • 使用 for 循环打印质数

    public class PrimeNumberTest {
    
        public static void main(String[] args) {
            int count = 0; //记录素数的个数
            boolean isPrime = true;
    
            for (int i = 2; i < 10001; i++) {
                //优化二:对本身质数的自然数是有效的
                for (int j = 2; j < Math.sqrt(i); j++) {
    
                    if (i % j == 0) {
                        isPrime = false;
                        break; //优化一:只对本身非质数的自然数是有效的
                    }
                }
                if (isPrime) {
                    count++;
    //                System.out.println(i);
                }
                isPrime = true;
            }
            System.out.println("个数:" + count);
        }
    }
    
    public static void main(String[] args) {
            int count = 0; //记录素数的个数
    
            label:for (int i = 2; i < 10001; i++) {
    
                for (int j = 2; j < Math.sqrt(i); j++) {
    
                    if (i % j == 0) {
                        continue label;
                    }
                }
                //能执行到此步骤的,都是质数
                count++;
            }
            System.out.println("个数:" + count);
    }
    

2.5.6 跳转关键字(break、continue)

  • break:结束当前循环
  • continue:结束本次循环
  • break 只能用于 switch 语句和循环语句中
  • continue 只能用于循环语句中
  • break、continue 之后不能有其他的语句,因为程序永远不会执行其后的语句
public class BreakContinueTest {
    public static void main(String[] args) {

//        for (int i = 1; i < 11; i++) {
//
//            if (i % 4 == 0) {
////                break; //123
//                continue; //123567910
//            }
//            System.out.println(i);
//        }

        lable:for (int i = 1; i <= 4; i++) {
            for (int j = 1; j <= 10; j++) {
                if (j % 4 == 0) {
//                    break; //默认跳出包裹此关键字最近的一层循环
//                    continue;
                    break lable; //结束指定标识层级的循环结构
                }
                System.out.println(i + "\t" + j);
            }
        }
    }
}

衡量一个功能代码的优劣:

1.正确性(正确的实现功能)

2.可读性(让人看得懂)

3.健壮性(经得住考验)

4.高效率与低存储:时间复杂度与空间复杂度(衡量算法的好坏)

上一篇:Javase基础知识


下一篇:Linux中chown和chmod的区别和用法(忘记了,查了下资料,记录下,)