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
- 创建工程 project
- 创建模块 module
- 创建包 package
- 创建类 class
- 编写代码,启动
导入 jar 包¶
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 一次都会产生一个新的字符串对象,放在堆内存中。
第一行代码中,先用 "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
Created: May 14, 2024