Java-Basic

安装与配置运行

  1. 官方网站下载

  2. Java 验证版本号 javac -version

java 是执行程序,javac 是编译程序

Java 的组成:JVM。核心类库,开发工具。

  1. 配置PATH,新版本的java会自动配置path

  2. 初始化测试代码:

    1
    2
    3
    4
    5
    public class Hello{
    public static void main(String[] args){
    System.out.println("Hello World");
    }
    }

1
2
javac Hello.java
java Hello # 注意这个地方没有class

IDEA 下载配置

  1. 官网下载

  2. 修改配置目录

    1. 打开安装目录/bin目录,找到 idea.properties

    2. 文件首部添加:

      1
      2
      3
      4
      idea.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
    3. 将以前的目录复制过来,重启

Java 入门

Java 项目

  1. 项目结构:工程-模块-包-类
  2. 包命名:com.duanyao.<应用名称> 使用小写
  3. 类名称,使用首字母大写的驼峰法
  4. 导入已有的模块,先将模块文件夹复制进来,然后 file-new-moudle from existing source,选择拷贝进来的模块文件夹,导入后有可能需要更改JDK版本,在右上方
  5. 删除模块,先 remove,再 del

快捷方式

  1. psam+tab 或者 main+tab
  2. "字符串".sout
  3. ctrl d 复制行数据到下一行
  4. ctrl y 删除所在行
  5. ctrl y 删除行 建议使用 ctrl x
  6. ctrl alt l 格式化代码
  7. alt shift 上下 上下移动行
  8. ctrl / 注释

Java 学习路径

https://zhuanlan.zhihu.com/p/139615436

Java 教程

https://www.runoob.com/java/java-basic-syntax.html

注释

三种注释

1
2
3
4
5
6
7
8
9
/**
文档注释,一般用在开头
**/

// 单行注释

/*
多行注释,似乎不太常用
*/

对象和类

源文件声明规则

一个源文件中只能有一个 public 类 一个源文件可以有多个非 public 类 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。 import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

注解 @ 比较常用的是 @Override

1
2
3
4
5
6
7
8
// 重写 toString 方法
@Override
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
3
public class ExampleClass {
int instanceVar; // 实例变量
}
静态变量或类变量(Class Variables): 类变量是在类中用 static 关键字声明的变量,它们属于类而不是实例,所有该类的实例共享同一个类变量的值,类变量在类加载时被初始化,而且只初始化一次。 可以通过类名或者实例名访问静态变量。 线程共享。 与常量不同,常量不能被修改。 命名:大写蛇形(全大写+下划线)
1
2
3
public class ExampleClass {
static int classVar; // 类变量
}
使用场景: 存储全局状态或配置信息 计数器或统计信息 缓存数据或共享资源 工具类的常量或方法 单例模式中的实例变量

注意:Java 只有两种传参方式:值(所有基本数据类型)/引用(所有对象类型)

命名规则

  1. 局部变量:小写头驼峰
  2. 成员变量 同上
  3. 实例变量、参数、
  4. 类名:大写头驼峰
  5. 静态变量(类变量)/常量:大写蛇形

修饰符

  • 访问
修饰符 当前类 同一包内 子孙类(同一包) 子孙类(不同包) 其他包
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 : 检查方法或者类 是否 属于/兼容于/是子类于 后者

基本语句结构

  1. 循环

三种结构:while(){} , do{}while(), for(){},其中for可以使用For-Each型(迭代式)

两个关键字: break continue

  1. 条件

没什么好说的,CPP

switch case 示例:

1
2
3
4
5
6
7
8
9
switch(exp){
case value:
//
break;//selective
case value2:
...;
default:
//
}

注意这是一种开关,遇到 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 包。

Number包装类

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
2
3
4
5
6
7
8
9
System.out.printf("浮点型变量的值为 " +
"%f, 整型变量的值为 " +
" %d, 字符串变量的值为 " +
"is %s", floatVar, intVar, stringVar);
String fs;
fs = String.format("浮点型变量的值为 " +
"%f, 整型变量的值为 " +
" %d, 字符串变量的值为 " +
" %s", floatVar, intVar, stringVar);

如果需要对字符串做很多修改,那么应该选择使用 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. 声明创建方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    double[] 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}); // 一种似乎有些奇怪的写法,一般用在直接传递给函数里面
  2. 作为函数返回值与参数

    1
    public static int[] reverse(int[] myList){}
  3. Arrays 类:集中关键的方法:Search, equals, fill, sort

日期时间

  1. 需要引入包 import java.util.Date;
  2. 具体的用法需要用到时候来查:Java 日期时间 | 菜鸟教程 (runoob.com)

正则表达式

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

方法

  1. System.out.println()是什么?
1
2
3
println() 是一个方法。
System 是系统类。
out 是标准输出对象。
  1. Java 的两类方法:有无返回值,调用形式的区别在于是否要给左侧赋值。

  2. 命令行参数使用例子

    1
    2
    3
    4
    5
    6
    7
    public 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
  3. 类的构造方法与方法重载,这没什么好说的

  4. 可变参数:一个方法只能是最后一个参数为可变参数,在类型后面加上 ...,实际上感觉没什么用,还不如用数组。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public 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);
    }
    }
  5. finalize 方法,定义后,在对象被JVM销毁之前自动被调用,用来清除回收对象,比如可以保证文件关闭了。可以参考 finalize-菜鸟

流、文件、IO

  1. 控制台读写: BufferedReader,需要引入 import java.io.*;

    1
    2
    3
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    str = br.readLine();
    System.out.write(b); // 一般直接用 print/println
  2. 文件流

    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
    import 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");
    }
    }
    }
  3. 目录:

    1. 先创建一个字符串对象,然后通过字符串对象创建File对象,然后调用 mkdir或者mkdirs创建单层或者多层文件夹。

    2. 字符串对象-文件对象-调用isDirectory()方法

    3. 删除空目录:deleteFolder(文件对象)

    4. 删除文件:文件对象.delete()

    5. 删除目录及其中的文件:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      import 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 类

  1. next 与 nexLine 区别:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    next():
    1、一定要读取到有效字符后才可以结束输入。
    2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
    3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
    next() 不能得到带有空格的字符串。

    nextLine():
    1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
    2、可以获得空白。
  2. 数类型的输入模板:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import 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