准备工作
JRE = JVM + 核心类库。JRE(Java运行环境),JVM(Java虚拟机,真正运行Java程序的地方),核心类库(Java已经写好的程序,供程序员调用)。
JDK = JRE + 开发工具。JDK(Java开发工具包),开发工具(java、javac等)。
安装JDK
官网下载:https://www.oracle.com/cn/java/technologies/downloads/,为了便于管理,建议采用Compressed Archive版本。
配置环境变量
配置Path环境变量:右键「此电脑」→「属性」→「高级系统设置」→「环境变量」→「系统变量」→「新建」,变量名:JAVA_HOME,变量值:填写JDK安装路径,如:C:\dev\java\jdk-21.0.4。
双击系统变量下的Path环境变量,新建%JAVA_HOME%\bin
并上移到第一位,最后点击确定即可。
测试JDK
打开CMD窗口,输入:java -version
,测试JDK是否安装成功。
业内大多数程序员都在遵守阿里巴巴的命名规则:《阿里巴巴Java开发手册(终极版)》。
IDEA
IDEA全称IntelliJ IDEA,是用于Java语言开发的集成环境,是业界公认的目前用于Java程序开发最好的工具。
IntelliJ IDEA官网:https://www.jetbrains.com/idea/download/
IntelliJ IDEA正版专属激活码领取(永久更新):
项目结构
- project(项目、工程)
- module(模块)
- package(包)
- class(类)
project中可以创建多个module,module中可以创建多个package,package中可以创建多个class。
IDEA常用快捷键
- main:快速输入相关代码
- Ctrl + D:复制当前行到下一行
- Ctrl + X:删除所在行
- Ctrl + Alt + L:格式化代码
- Shift + Alt + ↑,↓:上下移动当前代码
- Ctrl + /,Ctrl + Shift + /:代码注释
- Alt + Enter:强制类型转换
基础语法
标识符
就是给类,方法,变量等起的名字。
标识符命名规则--硬性要求:
- 必须由数字、字母、下划线_、美元符号$组成
- 数字不能开头
- 不能是关键字
- 区分大小写
软性建议:
- 小驼峰命名法:适用于变量名和方法名
- 大驼峰命名法:适用于类名
数据类型
基本数据类型,4大类8种:
- 整型:byte 1 字节,short 2 字节,int默认 4 字节,long 8 字节
- 浮点型:float,4字节;double默认,8字节
- 字符型:char,2字节
- 布尔型:boolean,1字节
// 默认是int类型,字面量后面加 L/l 变成long类型
long lg = 100L;
// 默认是double类型,字面量后面加 F/f 变成float类型
float f = 3.14F;
引用数据类型,String、数组。
获取键盘输入
public class HelloWorld {
public static void main(String[] args) {
// 得到一个键盘扫描器对象
Scanner sc = new Scanner(System.in);
// 调用sc,接收键盘输入数据
System.out.println("姓名:");
String name = sc.next();
System.out.println("年龄:");
int age = sc.nextInt();
System.out.println(name + age + "岁");
}
}
分支结构
switch 注意事项:
- 表达式类型只能是byte、short、int、char。JDK 5开始支持枚举,JDK 7开始支持String,不支持long、float、double
- case值不允许重复,且只能是字面量,不能是变量
- 不要忘记写break,否则会出现穿透现象
循环结构
for循环中控制循环的变量只能在循环中使用,while循环中控制循环的变量在循环后还可以继续使用。
生成随机数
public class HelloWorld {
public static void main(String[] args) {
System.out.println(createCode(4));
}
public static String createCode(int n) {
// 创建Random对象,用于生成随机数
Random r = new Random();
// 每位随机字符
String code = "";
for (int i = 1; i <= n; i++) {
int type = r.nextInt(3);
switch (type) {
case 0:
// 随机一个数字字符 0-9
code += r.nextInt(10);
break;
case 1:
// 随机一个大写字符 A 65 Z 65+25 (0-25)+65
char ch1 = (char) (r.nextInt(26) + 65);
code += ch1;
break;
case 2:
// 随机一个小写字符 a 97 z 97+25 (0-25)+97
char ch2 = (char) (r.nextInt(26) + 97);
code += ch2;
break;
}
}
return code;
}
}
内存分配
Java为了便于虚拟机执行Java程序,将虚拟机内存划分为:
- 方法区:字节码文件先加载到这里
- 栈:方法运行时所进入的内存,变量也在这一块区域中
- 堆:new出来的东西,会在这块内存中开辟空间并分配地址
- 本地方法栈
- 程序计数器
面向对象
this关键字,就是一个变量,用在方法中,可以拿到当前类的对象,即方法调用者的地址值。
构造器其实是一种特殊的方法,但这个方法没有返回值类型,方法名必须和类名相同。在创建对象时,会调用构造器。也就是说new Student()
就是在执行构造器,当构造器执行完了,也就意味着对象创建成功。
在设计一个类时,如果不写构造器,Java会自动生成一个无参数构造器。一旦定义了有参数构造器,Java就不再提供空参数构造器,此时建议加一个无参数构造器。
权限修饰符
封装设计规范用8个字总结,就是:合理隐藏、合理暴露,这就需要用到修饰符。
修饰符 | 本类 | 同一包下其他类 | 任意包下子类 | 任意包下任意类 |
---|---|---|---|---|
private | √ | |||
缺省 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
private < 缺省 < protected < public
实体JavaBean
一般称之为实体类,可以使用PTG插件1秒生成标准JavaBean。
实体类是一种特殊形式的类,只负责数据存取(除了给对象存、取值的方法就没有提供其他方法了),而对数据的处理交给其他类来完成,以实现数据和数据业务处理相分离(应用场景)。
super
super:代表继承的父类。
final
final修饰方法:表明该方法是最终方法,不能被重写;修饰类:表明该类是最终类,不能被继承;修饰变量:叫做常量,只能被赋值一次。
继承
成员变量:在子类的对象中,会把父类的成员变量也继承下的。
成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。
方法重写小技巧:使用@Override注解
,可以指定iava编译器,检查方法重写的格式是否正确,代码可读性也会更好。
多态
同类型的对象,表现出的不同形态,即为多态。
多态的表现形式:父类类型 对象名称 = 子类对象;
多态的前提:
- 有继承关系
- 有父类引用指向子类对象
- 有方法重写
抽象类
如果一个类中存在抽象方法,那么该类就必须声明为抽象类。抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。
使用abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。定义格式:修饰符 abstract 返回值类型 方法名(参数列表);
。
接口
接口是一种规则,是对行为的抽象。
接口和类的关系:
- 类和类:继承关系,只能单继承,不能多继承,但是可以多层继承
- 类和接口:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
- 接口和接口:继承关系,可以单继承,也可以多继承
字符串
String类常用方法
public class HelloWorld {
public static void main(String[] args) {
String s = "好abc";
// 字符串遍历
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
System.out.println(ch);
}
System.out.println("-------------------");
// 字符串转字符数组,再遍历
char[] chars = s.toCharArray();
for (char aChar : chars) {
System.out.println(aChar);
}
System.out.println("-------------------");
System.out.println(createCode(4));
}
public static String createCode(int n) {
String code = "";
String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
for (int i = 0; i < n; i++) {
int index = r.nextInt(data.length());
code += data.charAt(index);
}
return code;
}
}
StringBuilder
StringBuilder可以看成是一个容器,创建之后里面的内容是可变的,作用是提高字符串的操作效率。
StringJoiner
跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的,作用是提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用,因为JDK8才出现这个类。
集合
集合和数组的优势对比:
- 长度可变
- 添加数据的时候不需要考虑索引,默认将数据添加到末尾
public class HelloWorld {
public static void main(String[] args) {
// 创建ArrayList集合对象
ArrayList<String> list = new ArrayList<>();
list.add("Python");
list.add("Java");
list.add("Python");
System.out.println(list); // [Python, Java, Python]
// 往集合某个索引位置处添加数据
list.add(1, "MySQL");
System.out.println(list); // [Python, MySQL, Java, Python]
// 根据索引获取集合中某个索引位置处值
String rs = list.get(1);
System.out.println(rs); // MySQL
// 获取集合大小,即存储的元素个数
System.out.println(list.size()); // 4
// 根据索引删除集合中的某个元素,返回被删除的元素
System.out.println(list.remove(1)); // MySQL
// 直接删除某个元素,默认删除第一次出现的数据,删除成功返回true
System.out.println(list.remove("Python")); // true
System.out.println(list); // [Java, Python]
// 修改某个索引位置处的数据,修改后会返回原来的值
System.out.println(list.set(1, "JS")); // Python
System.out.println(list); // [Java, JS]
}
}
Collection单列集合
- List系列集合:添加元素是有序、可重复、有索引
- Set系列集合:添加元素是无序、不重复、无索引
List
Set
Map双列集合
Lambda表达式
JDK 8开始后的一种新语法形式。