Skip to content

1.第一天

  • Java SE(Java Standard Edition)
  • Java EE (Java Enterprise Edition)
  • Java ME(Java Micro Edition)
  • JDK(Java Development Kit),包含 jre 和其它工具。
  • JRE(Java Runtime Environment),java 程序运行时环境,包含 jvm 和运行时所需要的核心类库

安装 jdk

这里安装两个版本。jak8 和 jdk17。安装两个版本并不会冲突。

安装 jdk8 的时候会要求多安装一个 jre,但其实 jre 是包含在 jdk 里面的。jdk17 不需要此步骤。

jdk8

先创建两个目录,d:/develoment/JDK/jdk_8u271d:/develoment/JDK/jre_8u271,后面安装的时候 jdk 安装在第一个目录下,jre 安装在第二个目录下。

双击jdk-8u271-windows-x64.exe,u271 的 u 代表 update,271 代码更新版本号。

注意,如果安装失败需要重新安装,那么得先把 jdk 给卸载了。

然后,需要配置环境变量了。以便在任何目录下敲命令,都可以访问到执行文件。

  • 第一种配置方式,直接配置,不适用变量:

复制路径D:\development_environment\JDK\jdk_8u271\bin,然后添加到 path 中去。并且将顺序排到第一位,因为查找的时候是从前往后,从上到下去找的。

配置好后,可以打开命令行窗口,输入java,看有没有找到可执行文件。输入java -version,看到 1.8.0_271 版本,就说明配成功了。

  • 第二种配置方式,使用变量(为了后面学习 tomcat 而做准备)

添加变量 JAVA_HOME,指向 jdk 的安装路径。然后再添加一个环境变量%JAVA_HOME%/bin%JAVA_HOME%就代表使用变量 JAVA_HOME。

jdk17

安装 jdk17 的时候,jre 会自动安装。双击jdk-17.0.2_windows-x64_bin.exe,安装到目录D:\development_environment\JDK\jdk_17.0.2下。

安装完成后,重启命令行窗口,输入java -version并回车,发现返回版本号 17.0.2,这是为什么呢?

因为安装 jdk17 的时候会自动添加环境变量路径C:\Program Files\Common Files\Oracle\Java\javapath,去寻找最新的 jdk。

我们将 JAVA_HOME 指向 jdk17 的安装路径。

第 13 节课-HelloWorld 的编写和执行

Java 程序开发三步骤:编写、编译、运行。

  1. 将 Java 代码编写到扩展名为 .java 的源文件中
  2. 通过 javac.exe 命令对该 java 文件进行编译,生成一个或多个字节码文件
shell
javac HelloWorld.java
  1. 通过 java.exe 命令对生成的 class 文件进行运行(不要写.class,因为后面跟的是主类名字)
shell
java HelloChina

在随意一个目录下创建一个 HelloWorld.java 文件,写入

java
class HelloChina {

}

但是这个文件是程序员编写的,JVM 是看不懂的,也就不能运行,因此我们必须将编写好的 Java 源文件 编译成 JVM 可以看懂的字节码文件,也就是.class 文件。

class 代表类,HelloChina 代表类名,后面跟一个花括号。然后运行命令javac HelloWorld.java,可以看见目录生成了一个名为HelloChina.class的文件。它叫字节码文件,是 Java 的可运行文件,有了字节码文件,就可以运行程序了。注意名字HelloChinaHelloWorld,字节码文件的名字和类名是一样的。

在 DOS 命令行中,在字节码文件目录下,使用 java 命令进行运行。

shell
java 主类名字

主类是指包含 main 方法的类,main 方法是 Java 程序的入口:

然后执行命令java HelloChina执行字节码文件,发现控制台报错:

shell
# LuxCurl-user1@LuxCurl MINGW64 /d/code/new-course3/vue-docs/src/useful/java/helloworld (master)
# $ java HelloChina.class
# 错误:找不到或无法加载主类 HelloChina.class
# 原因:java.lang.ClassNotFoundException: HelloChina.class

# LuxCurl-user1@LuxCurl MINGW64 /d/code/new-course3/vue-docs/src/useful/java/helloworld (master)
$ java HelloChina
错误: 在类 HelloChina 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

所以我们在类 HelloChina 中添加public static void main(String[] args) {}

java
class HelloChina {
  public static void main(String[] args) {
    
  }
}

重新编译,运行,发现不会报错了。

我们再在 main 方法中添加一行打印:(printLn 表示 print line)

java
class HelloChina {
  public static void main(String[] args) {
    System.out.println("HelloWorld!!");
  }
}

重新编译运行,可以看到 dos 命令行窗口打印了'HelloWorld!!'

如果我们打印"HelloWorld!! 中国"呢?会发现打印的是乱码:

HelloWorld!! 涓浗!

这是为什么呢?因为字符集编码对不上,这个问题暂时不是特别重要且说来话长,就先跳过了。

第 14 节课-HelloWorld 程序的总结

常见错误

  • 拼写问题

Java 语言是一门严格区分大小写的语言

  • 编译、运行路径问题

例如执行命令javac Test1.java,提示找不到文件Test1.java.

  • 语法问题

声明为 public 的类应与文件名保持一致,否则编译失败

  • 字符编码问题

打印的中文呈现乱码,该怎么解决?

在使用 javac 命令式,可以指定源文件的字符编码

shell
javac -encoding utf-8 HelloWorld.java

然后再执行java HelloChina,发现不会出现乱码了。

HelloWorld 小结

java 程序结构与格式

calss 类名{
    方法{
        语句;
    }
}

java 程序的入口是 main 方法:

java
public static void main(String[] args){
    
}

两种常见的输出语句:

  1. 换行输出语句:输出内容,完毕后进行换行,格式如下:
java
System.out.println(输出内容);
  1. 直接输出语句:输出内容,完毕后不做任何处理,格式如下
java
System.out.print(输出内容);

WARNING

注意事项:
换行输出语句,括号内可以什么都不写,只做换行处理
直接输出语句,括号内什么都不写的话,编译报错

源文件名与类名

(1)源文件名是否必须与类名一致?public 呢?

如果这个类不是public,那么源文件名可以和类名不一致。但是不便于代码维护。

如果这个类是public,那么要求源文件名必须与类名一致。否则编译报错。

我们建议大家,不管是否是public,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护。

(2)一个源文件中是否可以有多个类?public 呢?

一个源文件中可以有多个类,编译后会生成多个.class字节码文件。

但是一个源文件只能有一个public的类。

注释

什么是注释?源文件中用于解释、说明程序的文字就是注释。

Java 中的注释类型:

  • 单行注释
java
//注释文字
  • 多行注释
java
/* 
注释文字 1 
注释文字 2
注释文字 3
*/
  • 文档注释
java
/**
 这是我的 java 程序
  @author  指定 java 程序的作者
  @version  指定源文件的版本
*/
  • 对于单行和多行注释,被注释的文字,不会不会出现在字节码文件中,进而不会被 JVM(java 虚拟机)解释执行。
  • 文档注释内容可以被 JDK 提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。

操作方式

shell
javadoc -d mydir -author -version HelloWorld.java

-author 和-version 就表示生成对应的 author 和 version。

第 17 节课

  • Java API 文档
  • Java 核心机制:JVM

JVM 功能说明

JVM(Java Virtual Machine,Java 虚拟机):是一个虚拟的计算机,是 Java 程序的运行环境。JVM 具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。

  • 功能 1:实现 Java 程序的跨平台性
  • 功能 2:自动内存管理 (内存分配、内存回收)

Java 程序在运行过程中,涉及到运算的数据的分配、存储等都由 JVM 来完成 Java 消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。 GC 的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏。

TIP

面试题:

Java 程序还会出现内存溢出和内存泄漏问题吗?Yes!

什么事内存溢出和内存泄漏?

内存泄漏会导致内存溢出,能力举个内存泄漏的例子吗?现在还不能!

两个案例的代码实现

案例 1:个人信息输出

  1. 首先我们确保安装好了 jdk,并且正确设置了环境变量。
  2. 在任意一个目录创建 PersonInfoLog.java 文件
  3. 然后写入如下代码:
java
public class PersonInfoLog {
  public static void main(String[] args) {
    System.out.println('姓名:录课程');
  }
}
  1. 执行命令javac -encoding utf-8 PersonInfoLog.java,将 java 文件编译问字节码文件。

然后发现报错,原来 java 的字符串要用双引号包裹起来。纠正后的代码:

java
public class PersonInfoLog {
  public static void main(String[] args) {
    System.out.println("姓名:录课程");
  }
}
  1. 重新执行命令javac -encoding utf-8 PersonInfoLog.java,得到PersonInfoLog.class文件
  2. 使用java PersonInfoLog命令执行字节码文件,得到打印
  3. 再改造一下代码,实现完整的个人信息输出:
java
public class PersonInfoLog {
  public static void main(String[] args) {
    System.out.println("姓名:录课程");    
    System.out.println("");
    System.out.println("性别:男");
    System.out.println("家庭住址:上海市松江区九亭"); 
  }
}
  1. 重新编译,运行,最后完成!

案例 2:输出心形

结合\n(换行),\t(制表符,看起来为几个空格),空格等在控制台打印出如下图所示的效果。

这里我使用了 java 的 for 循环方法。打印心形的时候,可以看作一行一行的打印。

然后我封装了一个方法,作用是打印多少个空格然后再打印符号。

我们可以先在直角坐标系中计算出每行每个符号所在的横坐标位置,然后打印的时候根据横坐标计算出应该再打印多少个空格然后再打印符号。

TIP

注意不要直接传入横坐标!!

java

public class LoveHeart {
  public static void printSpaceAndStar(int num, String symbol) {
    for(int x = 0; x < num - 1; x = x+1) {
      System.out.print(" ");
    }
    if (symbol == "") {
      System.out.print("*");
    } else {
      System.out.print(symbol);
    }
  }
  public static void main(String args[]) {
    // 中线为 16
    // 首先要知道,一个制表符 `\t` 会占 8 个空格。
    // 9
    printSpaceAndStar(7, "");
    printSpaceAndStar(2*(16-7), "");

    System.out.println("");

    // 5
    printSpaceAndStar(5, "");
    printSpaceAndStar(5, "");
    printSpaceAndStar(2, "I");
    printSpaceAndStar(1, " ");
    printSpaceAndStar(1, "l");
    printSpaceAndStar(1, "o");
    printSpaceAndStar(1, "v");
    printSpaceAndStar(1, "e");
    printSpaceAndStar(1, " ");
    printSpaceAndStar(1, "M");
    printSpaceAndStar(1, "E");
    printSpaceAndStar(2, "");
    printSpaceAndStar(5, "");

    System.out.println("");

    // 6
    printSpaceAndStar(6, "");
    printSpaceAndStar(2*(16-6), "");

    System.out.println("");

    // 8
    printSpaceAndStar(8, "");
    printSpaceAndStar(2*(16-8), "");

    System.out.println("");

    // 11
    printSpaceAndStar(11, "");
    printSpaceAndStar(2*(16-11), "");

    System.out.println("");

    // 14
    printSpaceAndStar(14, "");
    printSpaceAndStar(2*(16-14), "");

    System.out.println("");

    // 16
    printSpaceAndStar(16, "");
  }
}

Released under the MIT License.