JAVA

简介

JAVA三大类:

  • JAVASE
  • JAVAME
  • JAVAEE

主要特性:

  • 安全性
  • 面向对象
  • 跨平台
    • 原理:内部存在一个虚拟机
    • 通过javac将 .java文件编译成.class文件
    • java工具运行
    • jdb调试工具
    • JDK
  • 开源
  • 多线程
  • 简单易用
    • 有许多的库、核心类库

基础知识

注释:

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

关键字:

class:类 …

数据类型

字面量:

整数类型、小数类型、字符类型、字符串类型、布尔类型、空类型(null),常量也是有变量名的,只是值不会发生改变

  • 特殊的字面量
    • \t:制表符,打印时将前面的字符串长度补齐到8或是8的整数倍。最少1个,最多8个
常量

使用final关键字修饰常量

整数类型{byte(8位)、shot(16位)、int(32位)、long(64位)}、小数类型{float(32位)、double(64位)}、字符类型{char(16位)}、字符串类型(是通过String类进行表示的)、布尔类型{boolean(只有true和false,默认值是false)}

引用类型

相当于C的指针(储存地址),用于访问数组接口集合枚举这五类数据

变量
  • 局部变量:在方法、函数、块(使用{}括起来的部分,比如方法也属于块)中声明的变量
  • 实例变量:在类中声明的变量,属于类的实例
  • 静态变量(类变量):使用关键字static声明的变量,属于类
  • 参数变量:用于构造函数或方法时接收传递的值
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
29
30
31
32
33
34
class MyClass {
// 实例变量
int instanceVar;

// 静态变量
static int staticVar;

// 方法
void myMethod(int param) { // param 是参数变量
// 局部变量
int localVar = 5;

// 修改实例变量
instanceVar = 10; // 通过对象访问实例变量

// 修改静态变量
staticVar = 20; // 通过类名访问静态变量
// 或者可以使用:this.staticVar = 20; // 通过当前对象访问静态变量

}
}

public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();

obj.myMethod(); // 调用方法,输出变量值

// 通过类名访问静态变量
MyClass.staticVar = 30;

}
}

变量命名规则

驼峰命名法:除第一个单词外,后面的单词都要首字母大写

修饰符

  • default:接口中定义一个方法的默认实现

  • public:对所有类可见,即在其他类中可以直接访问

  • private:只在同一类中可见

  • protected:可以被同一包中的其他类访问,允许子类访问父类的某些成员,但又不希望这些成员对所有外部类可见。

    包通过使用package关键字在Java文件的顶部定义

运算符

主要列举不太熟悉的

  • 位运算符

    ^:如果对应位相同则为0,否则为1

    >>>:按位右移补零操作,移动得到的空位以0补充

  • 赋值运算符

    (%)=:取模(取余数)和赋值操作符,A%=B等价于A=A%B(注意A与B的运算顺序),其他的<<=|=等不一一列举了。

  • 条件运算符

    (?:):第一个位置的条件是否满足,满足的话赋值第二个位置的值,不满足赋值第三个

  • instanceof:用于操作对象实例,检查该对象是否是一个特定的类型(类类型或接口类型)

循环结构

  • while

  • do...while

  • for(初始化;布尔表达式;更新){}

条件语句

与C语言相同

1
2
3
4
5
6
7
8
9
if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}

switch语句

与C语言相同

1
2
3
4
5
6
7
8
9
10
11
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}

如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出

一些核心类库

数组

数组的初始化或定义:

  • 静态初始化

    1
    int[] arr = {1, 2, 3, 4, 5};
  • 动态初始化

    1
    int[][] arr = new int[5][4]; // 创建一个大小为5*4的数组

注意[]位置在dataType后面

  • For-Each循环在不使用下标的情况下遍历数组,demo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class TestArray {
    public static void main(String[] args) {
    double[] myList = {1.9, 2.9, 3.4, 3.5};

    // 打印所有数组元素
    for (double element: myList) {
    System.out.println(element);
    }
    }
    }
  • Arrays类

日期与时间

  • 获取当前时间,可用于记录系统运行的状态、错误信息等

    1
    LocalDateTime now = LocalDateTime.now();
  • 记录事件发生的时间

    1
    long timestamp = System.currentTimeMillis(); // 获取当前时间戳
  • 计算某段代码的执行时间,以优化性能,识别瓶颈

    1
    2
    3
    4
    5
    long startTime = System.currentTimeMillis();
    // 执行一些操作
    long endTime = System.currentTimeMillis();
    System.out.println("执行时间: " + (endTime - startTime) + " 毫秒");

  • 定时任务,比如定期备份、数据清理等

    1
    2
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    scheduler.schedule(() -> System.out.println("任务执行时间: " + LocalDateTime.now()), 1, TimeUnit.MINUTES);
  • 日期和时间格式化;时间比较、处理时区等

正则表达式

定义字符串的模式,可以用于搜索、处理文本,在爬虫中有广泛的应用

Java 正则表达式 | 菜鸟教程 (runoob.com)

方法

1
2
3
4
5
6
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
  • 方法重载

    使用同一个方法名,但是形参个数或者类型不一样,调用时,选择不同的参数类型即可调用不同的方法

  • 命令行参数

    当你需要在运行的时候使用某个变量时,在main()的括号里写入形参,运行时在后面加入变量值:

    1
    2
    3
    4
    5
    6
    7
    public class CommandLine {
    public static void main(String[] args){
    for(int i=0; i<args.length; i++){
    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
    // 一个简单的构造函数
    class MyClass {
    int x;

    // 以下是构造函数
    MyClass() {
    x = 10;
    }
    }
  • 可变参数

stream流的写入和输出

  • 控制台的输入与输出

    控制台可以理解为键盘,即java如何模拟键盘的输入输出

    1
    import java.io.*; //需要引用的包

    使用BufferedReader实现控制台输入:

    1
    2
    3
    4
    BufferedReader br = new BufferedReader(new 
    InputStreamReader(System.in));
    int read( ) throws IOException //read()方法每次读取一个输入字符,比如键盘输入'q'
    String readLine( ) throws IOException //读取字符串

    使用System.out.write()实现输出

    1
    2
    System.out.write(b);
    System.out.write('\n');
  • 读写文件

    读:FileInputStream

    1
    2
    3
    InputStream f = new FileInputStream("C:/java/hello");
    File f = new File("...");//...表示文件的路径
    InputStream in = new FileInputStream(f);

    写:FileOutputStream

    1
    2
    3
    OutputStream f = new FileOutputStream("...");//需要写入文件的路径
    File f = new File("...");
    OutputStream fOut = new FileOutputStream(f);

异常处理

Java 异常处理 | 菜鸟教程 (runoob.com)

面向对象

继承

extends可以用于声明一个类继承于另外一个类,子类拥有父类非private的属性和方法。

1
2
3
4
5
class 父类 {
}

class 子类 extends 父类 {
}

java不支持多继承,即类C即继承于类A又继承于B

implements可以用于同时继承多个接口。

super实现对父类成员的访问,用来引用当前的父类。

  • java类的构造器在有参数时,需要调用super(参数的值)
  • 在对父类的方法进行重写时,子类访问父类被重写的方法时需要使用super

this指向自己的引用,引用当前对象。

final修饰变量、方法和类。用于定义为最终类,不能继承,或被重写。

重写与重载

  • 重写:子类重写父类的方法,在子类中定义与父类具有相同名称、参数列表、返回类型(也可以不同,但必须是父类返回值的派生类)的方法。在调用子类的方法时,执行的是子类的方法而不是父类的,访问权限不能比父类被重写方法的低。finalstatic的方法不能被重写。当子类中调用父类的重写方法时,需要使用super,一般在重写代码上方加入@overwrite
  • 重载:在同一个类里,方法名相同,参数列表不同。比如,构造器的重载。

多态

包括对父类方法、接口的重写

抽象类

抽象类不能实例化对象,且必须被继承,才能被使用。

1
2
3
4
public abstract class classname
{
//类体
}
  • 抽象方法

    抽象方法只包含一个方法名,而没有方法体,抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号

封装

将抽象性函式接口的实现细节部分包装、隐藏起来的方法,步骤:

  1. 修改属性(一般限制为private)
  2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问

接口

  • 接口不能用于实例化对象

  • 接口中所有的方法必须是抽象方法

  • 接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public)

  • 接口的核心功能是定义一种规范或协议,明确规定”某些东西必须具备哪些行为或功能”

枚举

使用关键词enum,例如:

1
2
3
4
enum Color 
{
RED, GREEN, BLUE;
}

所有的枚举值都是 public static final ,此外,枚举既可以包含具体方法,也可以包含抽象方法

把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用,可以避免名字冲突

  • 创建包

    1
    2
    3
    4
    5
    6
    7
    /* 文件名: Animal.java */
    package animals;

    interface Animal {
    public void eat();
    public void travel();
    }
  • 导入包

    1
    import package1[.package2…].(classname|*);

    如果在一个包中,一个类想要使用本包中的另一个类,那么该包名可以省略。通过加“.”可以引用包中的某个特定类。

反射

动态代理,避免直接修改代码。允许程序在运行时动态地获取有关类、接口、方法、构造函数、字段等的详细信息,并能够在运行时操纵这些元素。

java反射的核心类位于java.lang.reflect包中,包括ClassMethodFiled等类