Skip to content

Java 语法学习

约 485 个字 50 行代码 预计阅读时间 2 分钟

JDK 安装

Mac M系列芯片(M1/M2)安装JDK并动态切换JDK版本_mac arm jdk-CSDN博客

Idea 快捷操作

缩写 扩展
main public static void main
"hello".sout System.out.println("hello");
.var 快捷生成变量名
fori for (int i = 0; i < ; i++) { }
右键 + generate 快捷生成 构造器,set,get,toString 方法
Alt + enter 快捷改爆红bug
Cmd (Macos) + 点击 跳转到函数声明
cmd + alt + space 提示输入

Hello World

文件名和类名保持一致

  • 编写程序: a.java
  • 编译程序:javac a.java
  • 运行程序:java a
  1. 创建工程 project
  2. 创建模块 module
  3. 创建包 package
  4. 创建类 class
  5. 编写代码,启动

导入 jar 包

image-20240515164710714

Java 基本语法

注释

  • 单行注释://
  • 多行注释:/* */
  • 文档注释:/** */

x进制

  • 二进制:0b 开头 0b0001
  • 八进制:0 开头 0141
  • 十六进制:0x 开头 0xfa

数据类型

byte a = 12; // -128 ~ 127
int b = 133;
float c = 3.14F; // 加上 F/f 
double d = 1.114514 // 浮点数默认是 double

自动类型转换

  • 表达式的最终结果类型由表达式中的最高类型决定。

  • 在表达式中,byte,short,char 是直接转化为 int 类型参与运算的

数组

格式:数据类型[] 数组名

  • 静态初始化:int[] arr = {1,2,3,4};
  • 数组的长度:arr.length
  • 动态初始化:int[] a = new int[3]; 默认为零。

多个变量指向同一个数组对象 浅拷贝

  • 存储的是同一个数组对象的地址

  • 修改的是同一个数组对象的数据

  • ```java int[] arr1 = {1,2,3}; int[] arr2 = arr1; // 浅拷贝

    System.out.println(arr1 == arr2); // true ```

类型传递

基本类型和引用类型(数组)的参数在传递的生活有什么不同

  • 都是 值传递
  • 基本类型:存储的数据值
  • 引用类型:存储的地址。
public class helloworld {
    public static void fun(int[] arr) {
        arr[2] = -1;
    }
    public static void main(String[] args) {
        int[] arr1 = {20,30,40};
        fun(arr1);
        System.out.println(arr1[2]); // -1
    }
}

方法重载

一个类中,方法的名称相同,但他们 形参列表不同

  • 形参不同:形参的 个数、类型、顺序 不同,不关心形参的名称。

this

主要用来解决:变量名称冲突问题。

this指向:调用它的对象。

public class Student {
    String name;
    double math;
    public void printScore() {
        System.out.println(name + "分数" + math);
    }
    public boolean vsScore(double math) {
        return (this.math > math);
    }
}

构造器

  • 如果不写构造器,Java 会自动生成无参数构造器。
  • 如果定义了有参数构造器,就需要自己写一个无参数构造器(不会自动生成了)。
public class Student {
    String name;
    double math;
    // 无参数构造器
    public Student(){
        // todo    
    }
    // 有参数构造器
    public Student(String name, double math) {
        // todo
    }

}

实体类

实体类 JavaBean

  • 私有成员变量,且为他们提供 get,set 方法
  • 必须有无参数构造器。

package

  • 同一个包下的程序,可以直接访问。
  • 访问其他包下的程序,必须导包才能访问。
  • 访问多个其他包下的程序,这些程序又一样的情况下,默认只能导入一个程序,其他程序用包名和类名访问。 如 com.itheima.pkg.itcast.Demo2 = new com.itheima.pkg.itcast.Demo2();

String

String 作为引用变量,常用方法

  • 获取长度:s.length()
  • 获取某个位置的字符:s.charAt(index)
  • ⭐ 比较两个字符串是否相同:s1.equals(s2); 字符串是引用变量,直接比较的是地址:s1 == s2 --> false
  • 截取子串:s.substring(beginIndex,endIndex); 包含begin,不包含end
  • 替换字符串中的部分:s.replace("acw","atcoder"); 把字符串中的 acw 替换为 atcoder
  • 检查字符串是否包含某个子串:s.contains("java");
  • 检查字符串是否以某个字符串开头:s.startsWith("javaisbestLang");
  • 分割字符串:public String[] split(String regex) s.split(','); 返回字符串数组。

字符串对象不可变,只是被换了:每次试图改变字符串对象实际上是产生了新的字符串对象

  • 用双引号"..." 给出的字符串,会存储在堆中的字符串常量池中,且相同内容的字符串只存出一份。
  • new 给出的字符串,每 new 一次都会产生一个新的字符串对象,放在堆内存中。

image-20240417222940639

第一行代码中,先用 "abc" 创建字符串,存在字符串常量池中,再 new 得到字符串对象,存在堆内存中。

第二行代码,直接用字符串常量池中的地址。

conclusion

比较字符串应该用 equals 方法,而 == 比较的是地址,容易出bug

ArrayList

集合容器。

范型:ArrayList<E> list = new ArrayList<E>() , 如果不加类型的话,可以插入任何类型。

常用方法

  • 在末尾插入:list.add();
  • 在指定位置插入:list.add(int index, E element);
  • 获取索引处的元素:list.get(int index);
  • 大小:list.size();
  • 删除索引处的元素:list.remove(int index);
  • 删除元素:list.remove(E element),只会删除第一次出现的元素。
  • 修改索引处的元素:list.set(int index,E element)

不能边遍历边删除,因为删除之后索引变了,会影响后面的元素和size。

  • 正向遍历,remove后再对 索引--
  • 反向遍历
// 正向遍历
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
    String ele = list.get(i);
    if(ele.contains("heima")) {
        list.remove(ele);
        i --; // 原因是因为remove 之后下一个元素的索引会减 1 (整体左移)
    }
}

Last update: June 17, 2024
Created: May 14, 2024