一、引入

JAVA语言特性

简单性:不像c++支持多继承,无指针。底层由c++实现。

面向对象

可移植性:一次编译,到处运行。在win上编译后可以在Linux上运行。

​ Java程序在Java虚拟机上运行,JVM : Java virtual machine

​ JDK :Java开发工具包

多线程

健壮性:产生的垃圾是自动回收的,不需要像c++一样手动回收内存空间。

安全性

JAVA的加载与执行

image-20250411190928553

注:.class文件是字节码文件,不是纯粹的二进制文件,否则操作系统就可以直接运行了。

编译:使用JDK中自带的javac.exe进行编译

使用方法:

1
javac java源文件的路径
  • 一个源文件可能生成多个.class文件
  • .class文件生成后,删除.java文件不影响程序的运行,但最好不要删掉,以防后面要修改。

运行:使用java.exe运行

使用方法:

磁盘上有一个A.class

1
java A 
  • JVM会启动类加载器ClassLoader
  • ClassLoader会去硬盘上根据classpath搜索A.class文件,找到该文件则将该字节码文件装载到JVM中
  • JVM将A.class文件解释成二进制数据
  • 操作系统执行二进制文件,和底层硬件平台交互

三种注释方式

1
2
3
4
5
6
7
8
9
10
11
12
// 单行注释

/*
多行注释
多行注释
*/

/**
* 文档注释
* 编写在这的信息可以被javadoc命令解析提取并生成到帮助文档中
*
*/

第一个程序

image-20250411195755479

public class 和class

注:公共类与文件名强制绑定

image-20250411193649371

文件名应该改为HelloWorld.java

  • 一个class文件最多只能有一个公共类,也可以没有。

  • 每个类中都可以编写入口main方法,想执行那个就用 java 类名

  • 实际开发中对于一个软件来说一般入口只有1个

二、基本语法

标识符

  • 字母(任何一个国家的语言)、数字、下划线、美元符号组成,不能包含其他符号。
  • 数字不能开头

命名规范

image-20250411202055977

加号运算符

  1. 求和
  2. 字符串拼接(加号两边有任意一边是字符串类型时进行,结果还是一个字符串)

变量

数据类型

  • int 整型
  • double 浮点型
  • String 字符串型
  • ……

image-20250411203916960

变量类型

在方法体中定义的变量,是局部变量

在类体中定义的变量,是成员变量,成员变量又分为静态变量实例变量

成员变量如果没有手动赋值,系统会自动赋默认值。

整型

自动类型转换

如果在整型类型后添加 L 或者 l ,那么这个整型数据就会被当成long类型处理。建议使用L,看的比较清楚。

  • 面试题

image-20250411204729955

强制类型转换

大容量无法自动转换成小容量,想让其编译通过,必须手动添加强制类型转换符。如 (int)

需记住:
  1. 当一个整型字面量没有超出某类型(byte short char)的取值范围时,可以直接赋值给该类型的变量,不需要强转。
  2. 多种数据类型混合运算时,先各自转成容量最大的,再做运算。
  3. byte short char混合运算时,先转成int再运算。
  4. 多种数据类型混合运算时,要先转成当前最大的类型再运算 double > float > long > int

image-20250412144847283

image-20250411211502699

1
2
double i = 1; //存在自动类型转换,由整型转换为浮点型。
//如果数值不规定类型,默认为int型

浮点型

数值后加F或f表示float类型,否则默认为double型

注:一旦有浮点型数据参与运算得出的结果,不要用“==”和别的数字进行相等比较!!! 一般相减然后小于一个很小的值,就认为相等。

字符型

  • Java中的char类型统一采用Unicode编码
  • 不允许空字符文字 ‘’
  • char默认值: \u0000 空字符(不是空格,空格是\u0020)

布尔型

long , int等类型的数值不能直接赋值给布尔型变量

进制

java中规定,0开头的是八进制,0b开头的是二进制,0x开头的是十六进制

接收键盘输入

1
2
3
4
5
6
7
8
// 创建键盘扫描器对象
java.util.Scanner s = new java.util.Scanner(System.in);

//获取输入内容
int num1 = s.nextInt();
double num2 = s.nextDouble();
String str = s.next(); //获取第一个空格前的内容
String str = s.nextLine(); // 获取一行

注:以上的代码存在问题,nextInt()nextDouble()next()在输入时肯定会输入换行符\r,但是这三个扫描器都不会吸收这个换行符,导致到nextLine()时,直接吸收换行符就完成运行了。

或者在最开始 import scanner对应的包

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Scanner;

public class Scan1{
public static void main(String[] args){
Scanner s = new Scanner(System.in);

int num1 = s.nextInt();
double num2 = s.nextDouble();
String str = s.next(); //获取第一个空格前的内容
String str = s.nextLine(); // 获取一行
}
}

逻辑运算符

& 逻辑与

|逻辑或

&& 逻辑与(左边是false就短路,不运行右边的内容)

||逻辑或(左边是true就短路,不运行右边的内容)

按位运算符

操作数必须是整数

移位运算符

经典面试题:怎么让2快速变成8?左移2位

>>算数右移

>>>逻辑右移

按位或

应用:设置某一位的值为1。

a | (1<<n)

按位异或

自反性:a^b^b = a

应用:简单的加密、解密

image-20250412161023726

按位取反

应用:对某一位清零

image-20250412161512105

赋值运算符

对于扩展的赋值运算符,不会改变变量的数据类型。

自带强制类型转换,把运算符右边的内容强制转换为左边的数据类型。

控制语句

字符串的比较不能使用==,因为String是引用数据类型,==此时比较的是两个变量是否指向同一个引用对象,比较的是地址。

比较两个字符串是否相等

1
2
3
String s = "admin";
String t = "adm";
System.out.print(s.equals(t));

switch 语句

switch(x){ } 这个x可以是int(byte short char 放进去也可以自动类型转换),字符串,枚举类型。

Java 12 新特性

image-20250412195046945

不需要自己写break了。

方法(C语言中的函数)

方法的调用

当这个方法修饰符列表有static关键字时,调用的格式为:

类名.方法名(实参列表)

什么时候调用时可以省略类名.

调用者和被调用者在同一个类时,可以省略。

方法重载 overload

什么情况构成了方法重载?

  1. 在同一个类中
  2. 方法名相同
  3. 形参列表不同:类型/顺序/个数 不同

哪个阶段的机制?

编译阶段的。

编译阶段已经完成了方法的绑定,即确定要调用哪个方法了。

什么情况下考虑使用方法重载?

功能类似,形参类型不同。

递归

递归调用很耗资源

能用循环就用循环。在实际开发中,有时候即使结束条件存在且合法,也可能出现栈溢出——递归太深了,栈内存不够导致。

package

作用

便于文件的管理,不同的类放在不同的包下,好维护。

定义包

在代码第一行添加语句 package 包名

包名规范

公司域名倒序+项目名+模块名+功能名

所有的包名都是小写

如何带包编译?

1
javac -d 编译后存放的目录 java源文件路径

有了包机制后的类名

包名.类名,在同一个包内不需要写包名,直接写类名即可。

import

使用不在同一个包的方法,需要import包

import支持静态导入(最好别用,可读性差)

1
2
3
4
5
import static java.lang.System.*

// 下面可以直接用输出的方法。
out.print(" ");
// 不使用静态导入时: System.out.print(" ")

intellij idea 的快捷键

image-20250413172912711

多行注释

ctrl shift /

复制一行

ctrl D

快速生成创建对象语句

类名.new.var

getter and setter

  1. alt + insert
  2. 选择getter and setter
  3. 选择要创建的内容

移动一行代码

alt shift 上键/下键

快速向下转型

变量名.castvar

快速查看方法的参数

ctrl + p

返回上一步

ctrl + alt + 左方向键

下一步

ctrl + alt + 右方向键

代码格式化

ctrl + alt + L

查看继承结构

ctrl + H

自动代码包裹

ctrl + alt + t