Java-Basic
安装与配置运行
官方网站下载
Java 验证版本号
javac -version
java
是执行程序,javac
是编译程序
Java 的组成:JVM。核心类库,开发工具。
配置PATH,新版本的java会自动配置path
初始化测试代码:
1
2
3
4
5public class Hello{
public static void main(String[] args){
System.out.println("Hello World");
}
}
1 | javac Hello.java |
IDEA 下载配置
官网下载
修改配置目录
打开
安装目录/bin
目录,找到idea.properties
文件首部添加:
1
2
3
4idea.config.path=D:/temp/.IntelliJIdea/config
idea.system.path=D:/temp/.IntelliJIdea/system
idea.plugins.path=D:/temp/.IntelliJIdea/config/plugins
idea.log.path=D:/temp/.IntelliJIdea/system/log将以前的目录复制过来,重启
Java 入门
Java 项目
- 项目结构:工程-模块-包-类
- 包命名:
com.duanyao.<应用名称>
使用小写 - 类名称,使用首字母大写的驼峰法
- 导入已有的模块,先将模块文件夹复制进来,然后
file-new-moudle from existing source
,选择拷贝进来的模块文件夹,导入后有可能需要更改JDK版本,在右上方 - 删除模块,先 remove,再 del
快捷方式
psam
+tab 或者main
+tab"字符串".sout
- ctrl d 复制行数据到下一行
- ctrl y 删除所在行
- ctrl y 删除行 建议使用 ctrl x
- ctrl alt l 格式化代码
- alt shift 上下 上下移动行
- ctrl / 注释
Java 学习路径
https://zhuanlan.zhihu.com/p/139615436
Java 教程
https://www.runoob.com/java/java-basic-syntax.html
注释
三种注释
1 | /** |
对象和类
源文件声明规则
一个源文件中只能有一个 public 类 一个源文件可以有多个非 public 类 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。 import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
注解 @ 比较常用的是 @Override 1
2
3
4
5
6
7
8// 重写 toString 方法
public String toString() {
return "名字: " + name + "\n" +
"年龄: " + age + "\n" +
"职位: " + designation + "\n" +
"薪水: " + salary;
}
基本数据类型
内置基本的有八种,比较常用的 int
,
boolean
默认false
, char
,注意
Striing
不是基本类型
引用类型:对象、数组
常量使用 final
修饰
注意 boolean
不能进行类型转换,小数默认是
double
,如果定义 float
,需要在后面加上
F/f
变量类型
实例变量(Instance
Variables):实例变量是在类中声明,但在方法、构造函数或块之外,它们属于类的实例,每个类的实例都有自己的副本,如果不明确初始化,实例变量会被赋予默认值(数值类型为0,boolean类型为false,对象引用类型为null)。
1
2
3public class ExampleClass {
int instanceVar; // 实例变量
}1
2
3public class ExampleClass {
static int classVar; // 类变量
}
注意:Java 只有两种传参方式:值(所有基本数据类型)/引用(所有对象类型)
命名规则
- 局部变量:小写头驼峰
- 成员变量 同上
- 实例变量、参数、
- 类名:大写头驼峰
- 静态变量(类变量)/常量:大写蛇形
修饰符
- 访问
修饰符 | 当前类 | 同一包内 | 子孙类(同一包) | 子孙类(不同包) | 其他包 |
---|---|---|---|---|---|
public |
Y | Y | Y | Y | Y |
protected |
Y | Y | Y | Y/N(说明) | N |
default (默认) |
Y | Y | Y | N | N |
private |
Y | N | N | N | N |
- 非访问
static:静态/类 变量/方法
final:常量,可继承不可重写的方法,不能被继承的类
abstract:抽象,注意不能同时与final共用,因为这个必须要被继承
synchronized:方法同一时间只能进入一个线程
volatile:线程更新变量强制写回,读取变量强制从共享内存读,保证线程间变量一致性。
运算符
没什么好说的,和C++类似
instanceof
: 检查方法或者类 是否 属于/兼容于/是子类于
后者
基本语句结构
- 循环
三种结构:while(){} , do{}while(), for(){},其中for可以使用For-Each型(迭代式)
两个关键字: break continue
- 条件
没什么好说的,CPP
switch case 示例:
1 | switch(exp){ |
注意这是一种开关,遇到 break
才会关闭跳出。注意
case
后的 value
只能是字面量或者字符串常量
Number & Math 类
所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
包装类 | 基本数据类型 |
---|---|
Boolean | boolean |
Byte | byte |
Short | short |
Integer | int |
Long | long |
Character | char |
Float | float |
Double | double |
这种由编译器特别支持的包装称为装箱,所以当内置数据类型被当作对象使用的时候,编译器会把内置类型装箱为包装类。相似的,编译器也可以把一个对象拆箱为内置类型。Number 类属于 java.lang 包。

Java Number & Math 类 | 菜鸟教程 (runoob.com)
需要用到的时候去查方法。
Character 类
因为实际开发中,有时需要用到对象,而不是内置数据类型,所以出现了包装类,Character类是char的包装类。
方法列表:Java Character 类 | 菜鸟教程 (runoob.com)
String 类
这是一个很常用的类,是不可更改的。
注意:new 的 String 放在 堆中,变量存储在栈中,是对堆的引用
注意:直接创建的String放在常量池/共享池中,并在堆中创建对象,对象指向常量池,栈中的变量指向堆中的对象。
java堆、栈、堆栈,常量池的区别,史上最全总结-腾讯云开发者社区-腾讯云 (tencent.com) 这个说的比较清楚。
注意:直接比较两个字符串,即使字面量一样,大概率还是得到 false
的结果。建议使用 equals
方法。
连接两个字符串,使用 concat
方法;length()
方法获取长度;isEmpty()
判空。
格式化字符串的创建示例:
1 | System.out.printf("浮点型变量的值为 " + |
如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。
访问器方法:获取有关对象的信息的方法。
更多方法:https://www.runoob.com/java/java-string.html#:~:text=stringVar)%3B-,String%20%E6%96%B9%E6%B3%95,-%E4%B8%8B%E9%9D%A2%E6%98%AF%20String
StringBuffer 和 StringBuilder 类
StringBuilder 类 和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问),但是更快。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
可以像python
中的列表一样使用
append, insert,delete
等方法
具体的方法:Java StringBuffer 和 StringBuilder 类 | 菜鸟教程 (runoob.com)
数组
声明创建方法:
1
2
3
4
5
6
7
8
9
10
11double[] myList; // 建议使用
double myList[]; // 不建议使用,效果没区别
int[] myList = new int[size];
int[] myList = {value,value2};
int[][] a = new int [2][3];
String[][] s = new String[2][3];
s[0] = new String[2];
s[1] = new String[3]; // 注意后面的维度可以后续定义,可以不同
System.out.println(new double[]{1, 2, 3}); // 一种似乎有些奇怪的写法,一般用在直接传递给函数里面作为函数返回值与参数
1
public static int[] reverse(int[] myList){}
Arrays
类:集中关键的方法:Search, equals, fill, sort
日期时间
- 需要引入包
import java.util.Date;
- 具体的用法需要用到时候来查:Java 日期时间 | 菜鸟教程 (runoob.com)
正则表达式
Java 正则表达式 | 菜鸟教程 (runoob.com)
方法
System.out.println()
是什么?
1 | println() 是一个方法。 |
Java 的两类方法:有无返回值,调用形式的区别在于是否要给左侧赋值。
命令行参数使用例子
1
2
3
4
5
6
7public class CommandLine {
public static void main(String[] args){ // 实际上就是 String[] 字符串数组
for(int i=0; i<args.length; i++){ // 这里的 length 应该是类变量?
System.out.println("args[" + i + "]: " + args[i]);
}
}
}1
2
3
4
5
6
7
8
9$ javac CommandLine.java # 编译
$ java CommandLine this is a command line 200 -100 # 运行,带参数
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100类的构造方法与方法重载,这没什么好说的
可变参数:一个方法只能是最后一个参数为可变参数,在类型后面加上
...
,实际上感觉没什么用,还不如用数组。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23public class VarargsDemo {
public static void main(String[] args) {
// 调用可变参数的方法
printMax(34, 3, 3, 2, 56.5);
printMax(new double[]{1, 2, 3});
}
public static void printMax( double... numbers) {
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
}
double result = numbers[0];
for (int i = 1; i < numbers.length; i++){
if (numbers[i] > result) {
result = numbers[i];
}
}
System.out.println("The max value is " + result);
}
}finalize
方法,定义后,在对象被JVM销毁之前自动被调用,用来清除回收对象,比如可以保证文件关闭了。可以参考 finalize-菜鸟
流、文件、IO
控制台读写:
BufferedReader
,需要引入import java.io.*;
1
2
3BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
str = br.readLine();
System.out.write(b); // 一般直接用 print/println文件流
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29import java.io.*;
//in
File f = new File("C:/java/hello");
InputStream in = new FileInputStream(f);
//out
public class fileStreamTest {
public static void main(String[] args) {
try {
byte bWrite[] = { 11, 21, 3, 40, 5 };
OutputStream os = new FileOutputStream("test.txt"); // 输出流
for (int x = 0; x < bWrite.length; x++) {
os.write(bWrite[x]); // writes the bytes //写输出
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();
for (int i = 0; i < size; i++) {
System.out.print((char) is.read() + " ");
}
is.close();
} catch (IOException e) {//处理异常
System.out.print("Exception");
}
}
}目录:
先创建一个字符串对象,然后通过字符串对象创建File对象,然后调用
mkdir
或者mkdirs
创建单层或者多层文件夹。字符串对象-文件对象-调用
isDirectory()
方法删除空目录:deleteFolder(文件对象)
删除文件:
文件对象.delete()
删除目录及其中的文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import java.io.File;
public class DeleteFileDemo {
public static void main(String[] args) {
// 这里修改为自己的测试目录
File folder = new File("/tmp/java/");
deleteFolder(folder);
}
// 删除文件及目录
public static void deleteFolder(File folder) {
File[] files = folder.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
deleteFolder(f);
} else {
f.delete();
}
}
}
folder.delete();
}
}
Scanner 类
next 与 nexLine 区别:
1
2
3
4
5
6
7
8
9next():
1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next() 不能得到带有空格的字符串。
nextLine():
1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。数类型的输入模板:
1
2
3
4
5
6
7
8
9
10
11
12import java.util.scanner;
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int a=0;
if(scan.hasNextInt()){ //float 也是一样的,next与nextline也是一样的
i = scan.nextInt();
}
//
scan.close();
}
异常处理
Java 异常处理 | 菜鸟教程 (runoob.com) 内容有点多,有点懒。
重点:三种异常的区分,如何自定义一个异常、如何在自己的代码中抛出异常、如何在方法声明中指出可能出现的异常、如何catch异常进行处理,如何使用finally进行无论异常的收尾。
不太高级的高级:使用 try-with-resources
进行资源的自动关闭,有点类似于CPP的with
。