[笔记] Java基础(2)-基本语法

153 阅读4分钟

1. 字面值常量

  • 字符串:使用双引号,内部可以为空
  • 字符:使用单引号,内部有且只有一个字符,可以是中文
  • 整数:默认为int类型,表示double加后缀Ll,表示float加后缀Ff
  • 小数:默认为double类型,表示float加后缀Ff
  • 布尔:falsetrue
  • 空:null

2. 进制

  • 二进制:以0b开头
  • 八进制:以0开头
  • 十进制:默认十进制
  • 十六进制:以0x开头

3. 数据表示形式

  • 原码:使用最高位表示符号,其余位表示数值
  • 反码:正数的反码与原码相同,负数的反码为原码取反
  • 补码:正数的反码与原码相同,负数的反码为原码取反加一,运算时都以补码进行运算

4. 数据类型

  • 基本数据类型:基本数据类型不能为null
    • 整型:byte (1B)、short (2B)、int (4B)、long (8B)
    • 浮点型:float (4B)、double (8B)
      • float-3.403E38~3.403E38
      • double-1.798E308~1.798E308
    • 字符型:char(2B),使用Unicode编码
    • 布尔型:boolean(未明确指定)
  • 基本数据类型隐式转换:
    • byteshortchar在进行混合运算时都会自动提升为int
    • 提升顺序:byteshortchar >>int>> long >> float >> double
  • 引用数据类型:数组、类、接口、枚举

5. 运算符

  • 算术运算符

    • 整数相除的运算结果为整数
    • %运算的结果符合只与左边的符号有关,与右边无关
  • 赋值运算符

    • byte b=10;相当于:byte b;b=10
    • byte b=10;b++;相当于:byte b;b=(byte)(b+1);
    • byte b=10;b=b+1报错:因为b+1的结果为int类型
    • byte b=10;b+=1相当于:byte b;b=(byte)(b+1);
  • 关系运算符

  • 逻辑运算符:&(逻辑与)、|(逻辑或)、^(逻辑异或)、!(逻辑非)、&&(短路与)、||(短路或)

  • 位运算符:&(位与)、|(位或)、^(位异或)、~(取反)、>>(有符号右移)、>>>(无符号右移)、<<(左移)

    • 一个数与另一个数位异或两次,结果不变。可用于交换两数的值(不使用中间变量):

      /* 方式一:不使用中间变量,优点:不会溢出 */
      x = x^y;
      y = x^y;
      x = x^y;
      /* 方式二:不使用中间变量,缺点:x+y可能会溢出 */
      x = x+y;
      y = x-y;
      x = x-y;
      
  • 三目运算符:?:

6. 输入输出

  • 输出

    System.out.println("Hello World");
    
  • 输入

    import java.util.Scanner;
    
    Scanner sc = new Scanner(System.in);
    sc.nextInt();
    sc.nextLine();
    

7. 条件判断

  • if语句:if..else if..else
  • switch语句:switch..case..default
    • 表达式可以接收:byteshortcharintString(JDK1.5)、Enum(JDK1.7)
    • 表达式不可以接收:long
    • case后面只能是常量
    • 没有break会出现case穿透现象

8. 循环

  • for循环
    • 无限循环:for(;;){}
  • while循环
    • 无限循环:while(true){}
  • do..while循环
    • 无限循环:do{}while(true);
  • break语句:用于结束循环或switch语句,可以加标号
  • continue语句:用于结束本次循环,可以加标号

9. 方法

  • 方法是完成特定功能的代码块
  • 方法不能嵌套,方法之间为平级关系
  • return用于结束方法,可以没有返回值
  • 方法重载:方法名相同,参数列表不同(长度或类型)

10. 数组

  • 一维数组定义

    /* 方式一:动态初始化,必须指明长度 */
    type[] arr = new type[length];
    /* 方式二:静态初始化,不能指明长度 */
    type[] arr = new type[]{item1,item2...};
    /* 方式三:快速初始化,长度等于元素数量 */
    type[] arr = {item1,item2...};
    
  • 数组默认初始化值

    • 基本类型:
      • byteshortintlong0
      • floatdouble0.0
      • booleanfalse
      • char'\u0000'
    • 引用类型:null
  • 数组名存放的内容:[I@19bb25a[表示维度,I表示类型,@后面为地址值)

  • 多维数组定义

    /* 方式一:指定所有维度长度 */
    /* type[][] arr 可写为 type[] arr[] 或 type arr[][] */
    type[][] arr = new type[length1][length2];
    /* 方式二:指定高维长度 */
    type[][] arr = new type[length1][];
    /* 方式三:指定元素 */
    type[][] arr = {{item1,item2...},{item3,item4...}...};
    
  • Java中参数传递为值传递,地址也是值

11. 内存划分

  • 栈内存:存放局部变量
  • 堆内存:存放new生成的对象
  • 方法区:存放运行时的字节码文件,包含静态区(用于存放静态成员及方法)
  • 本地方法区
  • 寄存器:与CPU相关

12. 随机数

  • Math.random():范围[0,1)

13. 静态导入

  • 语法:import static 包名.类名.方法名
  • 可以导入类中的静态方法,导入后可以直接使用方法名调用,不用加类名
  • 在使用类中存在相同方法时,会产生冲突

14. 可变参数

  • 语法:public static void fun(int... arr) { ... }
  • 相当于一个数组,在传入参数是会把参数封装成一个数组
  • 当方法有多个参数时,可变参数必须为最后一个参数

15. 递归

  • 方法自身调用自身,但调用次数过多会导致栈内存溢出
  • 构造方法不能递归调用
  • 使用场景
    • 获取文件夹大小:获取所有子文件大小并求和
    • 删除文件夹:递归删除子文件,最后删除父目录
    • 拷贝文件夹:先创建父目录,递归拷贝文件;注意源和目标相同时会产生多级目录
    • 斐波那契数列:第一第二项为1,其余项为前两项之和
    • 约瑟夫环:当计数到3时移除元素,直到余下最后一个元素