diff --git "a/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/1\343\200\201Java\350\257\255\350\250\200\344\273\213\347\273\215.md" "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/1\343\200\201Java\350\257\255\350\250\200\344\273\213\347\273\215.md" index aa28c41aee0bef16b64716c6a9e4873c449cb27c..29942c5f39b24bcdbb19b2ac57c3dc3dbac835fc 100644 --- "a/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/1\343\200\201Java\350\257\255\350\250\200\344\273\213\347\273\215.md" +++ "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/1\343\200\201Java\350\257\255\350\250\200\344\273\213\347\273\215.md" @@ -136,4 +136,30 @@  - \ No newline at end of file + + +# 3、开发工具使用 + +## 3.1、vscode + +对于初学者来说的话,可以vscode来编写代码,这样的话,可以提高大家对于编程能力,甚至后面出去面试的话, 遇到笔试题大家也不用慌。主要是提高自己的编程能力,这点很重要!!! + +### 安装教程: + +官网:https://code.visualstudio.com/ + +进入官网点击Download for Windows + + + +后面傻瓜式安装即可! + +### vscode设置中文 + +在应用商店中搜索Chinese,然后点击安装即可,安装完成之后需要重启vscode + + + +## 3.2、Idea + +工作中基本都是使用的是Idea,这个后续会专门出一个文档教大家使用Idea \ No newline at end of file diff --git "a/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/2\343\200\201\345\237\272\347\241\200\345\255\246\344\271\240.md" "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/2\343\200\201\345\237\272\347\241\200\345\255\246\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..eb0a4e2f30298be424d40eb971e69a4e822420e2 --- /dev/null +++ "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/2\343\200\201\345\237\272\347\241\200\345\255\246\344\271\240.md" @@ -0,0 +1,477 @@ +# 永远的hello world + +每一个编程语言都有属于自己的hello world,那下面我们就打开vscode写出我们的第一个hello world吧! + +```java +public class HelloWorld{ + + public static void main(String[] args){ + System.out.println("hello world"); + } +} +``` + +在vscode中打开终端,进入dos窗口。 + +如果我们发现ls看不到我们创建的java文件,那我们就需要使用`cd`命令进入到对应的目录中 + + + +在dos窗口中我们输入相关命令,可以看到终端输出的是我们代码中想要的结果。 + +```cmd +PS C:\java-study\day01\src> javac HelloWorld.java +PS C:\java-study\day01\src> java HelloWorld +hello world +``` + +我们查看一下当前目录中是不是多了点什么呢? + +```cmd +PS C:\java-study\day01\src> ls + + + 目录: C:\java-study\day01\src + + +Mode LastWriteTime Length Name +---- ------------- ------ ---- +-a---- 2024/9/5 19:48 425 HelloWorld.class +-a---- 2024/9/5 19:41 125 HelloWorld.java +``` + +没错,多了一个class文件!Java的跨平台性就在这个class文件上,我们编写的是Java文件,通过javac命令编译后会生成一个class的文件,这个class的文件叫做字节码文件,系统会将这个字节码文件转成二进制文件进行执行,具体的原理下面会讲解 + +**上面的操作是什么原理呢?为什么要这么操作呢?** + +1、我们编写Java代码时,首先需要创建一个文件,这个文件的后缀名需要以.java结尾,我们统称为Java文件,而该文件的命名是首字母大写(是一种规范) + +2、文件中会创建一个类,也就是下面这个部分 + +```java +public class HelloWorld { + +} +``` + +首先`public class`是固定不变的,然后后面跟着的是Java文件的名称,我们叫做类名,整个代码体我们叫做类,以`public`修饰的class叫做公共类,一个Java文件中有且只能有一个公共类,且类名要与java文件名相同,否则会报错,我们下面会进行测试。 + +3、类中会有方法,而下面的内容也就叫做方法,并且是一个非常重要的方法 + +```java +public static void main(string[] args) { + +} +``` + +这个方法叫做main方法,也叫做程序的入口,每一个程序**有且只能有一个**上述的main方法 + +4、下面的内容就是打印hello world啦,我们可以叫做方法体,方法内容等等了 + +```java +System.out.println("hello world"); +``` + +# javac和java命令 + +## javac命令是什么? + +`javac` 是 Java 编程语言的编译器命令,用于将 Java 源代码文件(`.java` 文件)编译成 Java 字节码文件(`.class` 文件)。字节码文件可以在 Java 虚拟机(JVM)上运行。 + +### 使用案例: + +以下是一些常用的 `javac` 命令选项:我们目前只需关注前4个就好了 + +1. **编译单个文件**: + + ```shell + javac HelloWorld.java + ``` + + 这将编译 `HelloWorld.java` 文件,并生成 `HelloWorld.class` 文件。 + +2. **指定类路径**: + + ```shell + javac -cp .;lib/some.jar HelloWorld.java + ``` + + `-cp` 或 `-classpath` 选项用于指定类路径,可以包含多个路径,用分号或冒号分隔。 + +3. **生成多个类文件**: + + ```shell + javac *.java + ``` + + 这将编译当前目录下的所有 `.java` 文件。 + +4. **指定输出目录**: + + ```shell + javac -d output_dir HelloWorld.java + ``` + + `-d` 选项用于指定输出目录,编译后的 `.class` 文件将被放置在这个目录中。 + +5. **生成源代码和类文件的依赖关系**: + + ```shell + javac -Xlint:dep-warnings HelloWorld.java + ``` + + `-Xlint` 选项用于生成额外的警告信息,例如依赖关系警告。 + +6. **查看编译器版本**: + + ```shell + javac -version + ``` + + 这将显示编译器的版本信息。 + +7. **查看帮助信息**: + + ```shell + javac -help + ``` + + 这将显示 `javac` 命令的帮助信息,包括所有可用的选项。 + +## java命令是什么 + +`java` 命令是用于启动 Java 应用程序的命令行工具,它使用 Java 虚拟机(JVM)来运行编译后的 Java 字节码文件(`.class` 文件)。 + +### 使用案例 + +以下是一些常用的 `java` 命令选项: + +1. **运行 Java 应用程序**: + + ```text + java HelloWorld + ``` + + 这将运行 `HelloWorld` 类,前提是 `HelloWorld.class` 文件位于当前目录或类路径中。 + +2. **指定类路径**: + + ```text + java -cp .;lib/some.jar HelloWorld + ``` + + `-cp` 或 `-classpath` 选项用于指定类路径,可以包含多个路径,用分号或冒号分隔。 + +3. **运行包含 main 方法的类**: + + ```text + java -cp . HelloWorld + ``` + + 这将运行 `HelloWorld` 类,其中 `HelloWorld` 必须包含一个 `public static void main(String[] args)` 方法。 + +4. **查看 JVM 版本**: + + ```text + java -version + ``` + + 这将显示当前 Java 运行时环境的版本信息。 + +5. **查看 Java 帮助信息**: + + ```text + java -help + ``` + + 这将显示 `java` 命令的帮助信息,包括所有可用的选项。 + +6. **设置 JVM 启动参数**: + + ```text + java -Xms256m -Xmx512m HelloWorld + ``` + + `-Xms` 用于设置 JVM 启动时的初始堆大小,`-Xmx` 用于设置最大堆大小。 + +7. **启用或禁用 JIT 编译器**: + + ```text + java -Xint HelloWorld + ``` + + `-Xint` 选项用于禁用即时编译器,这在某些调试场景中可能很有用。 + +8. **启用远程调试**: + + ```text + java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 HelloWorld + ``` + + 这将启动一个远程调试会话,允许调试器连接到 JVM。 + +9. **运行 Java 应用程序并传递参数**: + + ```text + java HelloWorld arg1 arg2 + ``` + + 这将运行 `HelloWorld` 类,并将 `arg1` 和 `arg2` 作为参数传递给 `main` 方法。 + + + +# Java运行的原理(面试题) + +Java 运行原理涉及到几个关键步骤,这些步骤共同构成了 Java 应用程序的生命周期。以下是 Java 程序从编写到运行的整个过程: + +1. **编写源代码**: + + - Java 程序是用 Java 语言编写的,保存为 `.java` 文件。例如,一个简单的 Java 应用程序可能包含一个 `HelloWorld.java` 文件。 + +2. **编译源代码**: + + - 使用 `javac` 命令行工具将 `.java` 文件编译成 Java 字节码(`.class` 文件)。字节码是 JVM 能够理解的中间表示形式。 + + ```text + javac HelloWorld.java + ``` + +3. **运行字节码**: + + - 使用 `java` 命令行工具运行编译后的字节码文件。JVM 负责加载字节码文件,并在运行时执行。 + + ```text + java HelloWorld + ``` + +4. **类加载器**: + + - JVM 使用类加载器(Class Loader)机制来动态加载 `.class` 文件。类加载器负责将字节码加载到 JVM 中,并将其转换为 JVM 内部表示的类。 + +5. **字节码验证**: + + - 在加载字节码之后,JVM 会进行字节码验证(Bytecode Verification),确保加载的字节码是安全的,不会破坏 JVM 的稳定性。 + +6. **字节码转换**: + + - 经过验证的字节码可能会被即时编译器(Just-In-Time, JIT Compiler)编译成本地机器代码。这个过程称为 JIT 编译,它可以提高程序的运行效率。 + +7. **执行**: + + - 一旦字节码被加载和(可选地)编译,JVM 就会开始执行程序。JVM 负责管理程序的执行,包括内存分配、垃圾回收、线程调度等。 + +8. **垃圾回收**: + + - Java 程序运行过程中会创建对象,当对象不再被引用时,JVM 的垃圾回收器(Garbage Collector, GC)会自动回收这些对象占用的内存。 + +9. **异常处理**: + + - 如果程序运行时出现异常,JVM 会尝试找到匹配的异常处理器(try-catch 块)。如果没有找到合适的处理器,程序将终止,并可能抛出错误信息。 + +10. **程序终止**: + + - 当程序执行完成或者遇到无法处理的异常时,JVM 会终止程序的运行,并释放所有分配的资源。 + +整个过程中,JVM 提供了一个隔离的环境,使得 Java 程序可以在不同的操作系统和硬件平台上运行,而不需要对源代码进行修改。这种跨平台的特性是 Java 的一大优势。 + +# 一个Java文件中可以编写几个类? + +新建一个TestCheckClass.java文件进行测试 + +## 测试一:一个公共类,但是类名和文件名不一致 + +源代码内容: + +```java +public class Check { + +} +``` + +我们看一下可以进行编译吗? + +``` +PS C:\java-study\day01\src> javac TestCheckClass.java +TestCheckClass.java:1: 错误: 类Check是公共的, 应在名为 Check.java 的文件中声明 +public class Check { + ^ +1 个错误 +``` + +**我们发现编译时是报错的,验证了Java中公共类的类名需要和源文件名称保持一致** + +## 测试二:没有公共类可以吗? + +源代码内容: + +```java +class Check { + +} +``` + +我们看一下可以进行编译吗? + +```cmd +PS C:\java-study\day01\src> javac TestCheckClass.java +PS C:\java-study\day01\src> ls + + + 目录: C:\java-study\day01\src + + +Mode LastWriteTime Length Name +---- ------------- ------ ---- +-a---- 2024/9/5 20:30 193 Check.class +-a---- 2024/9/5 20:30 18 TestCheckClass.java +``` + +发现可以正常编译的,所以一个源文件中可以没有公共类 + +## 测试三:一个源文件中可以有多个非公共类吗? + +源代码内容: + +```java +class Check { + +} +class Test1 { + +} +class Test2 { + +} +``` + +我们看一下可以进行编译吗? + +```cmd +PS C:\java-study\day01\src> ls + + + 目录: C:\java-study\day01\src + + +Mode LastWriteTime Length Name +---- ------------- ------ ---- +-a---- 2024/9/5 20:33 193 Check.class +-a---- 2024/9/5 20:33 193 Test1.class +-a---- 2024/9/5 20:33 193 Test2.class +-a---- 2024/9/5 20:32 58 TestCheckClass.java +``` + +可以正常编译的,并且出现了多个class文件,在这里需要注意的是,**一个类对应一个class文件!** + +## 测试四:一个源文件中可以有多个非公共类和一个公共类吗? + +答案是可以的,不相信的同学可以自行测试哟 + +## 总结: + +- 一个Java源文件中可以没有公共类,但是有public修饰的公共类时,类名需要和源文件名保持一致,否则编译不通过 +- 一个Java源文件中可以有多个非公共类,编译完成之后,会生成一一对应的class文件 + +大家思考一个问题,我们都知道代码中是英文编写的,当一个java文件特别庞大的时候,我们是不是需要做点什么?是不是需要加一点类似笔记之类的去标记一下某一块的代码内容是做什么用处的,没错,这就需要我们下面讲解的内容了 + +# 注释 + +注释很好理解,它指的是在源代码中添加的说明性文本,这些文本不会被编译器或解释器执行。 + +## 注释的主要作用如下: + +- **提高代码可读性**(是在注释也有可读性的前提下):注释可以帮助其他程序员(或未来的你)理解代码的功能和逻辑,特别是当代码逻辑复杂或不直观时。 +- **便于维护**:当代码需要修改或扩展时,良好的注释可以减少维护工作量,因为维护者可以更快地理解代码结构和功能。但是维护者维护代码的时候,也需要维护注释的哦 +- **记录设计决策**:注释可以用来说明这块代码是怎么编写的,用了什么技术,这有助于维护者理解代码背后的设计意图。 +- ...还有很多,后面大家可以慢慢理解 + +## Java中注释的分类 + +在Java中,注释主要分作三类, + +- **单行注释**,主要是用两个反斜杠来实现的 + +```java +//这是一个单行注释 +``` + +- **多行注释** + +```java +/* +这是第一行注释 +这是第二行注释 +这是第三行注释 +... +*/ +``` + +- **文档注释**,也叫做JavaDoc注释,这个注释会在项目中大量使用,在这儿了解即可 + +JavaDoc 是一种特殊的注释风格,用于在 Java 源代码中生成 HTML 格式的 API 文档。JavaDoc 注释以 `/** ... */` 形式出现,通常位于类、方法、构造函数或字段的声明之前。JavaDoc 注释的目的是提供关于代码元素的详细描述,这些描述可以被 JavaDoc 工具解析并用来生成文档。 + +下面是 JavaDoc 注释的一些基本组成部分和使用指南: + +**基本语法** + +- **类注释**:通常位于类声明之前。 +- **方法注释**:位于方法声明之前。 +- **字段注释**:位于字段(变量)声明之前。 +- **构造函数注释**:位于构造函数声明之前。 + +**常用标签** + +- `@param`:描述方法参数。 +- `@return`:描述方法返回值。 +- `@throws` 或 `@exception`:描述方法可能抛出的异常。 +- `@see`:提供相关文档的链接。 +- `@version`:指示类或接口的版本信息。 +- `@deprecated`:指示某个方法或类已过时。 +- `@author`:指示代码的作者。 +- `@since`:指示该元素自哪个版本起可用。 +- `{@link}`:创建到其他类或方法的链接。 + +```java +/** + * 这是一个示例类,用于演示 JavaDoc 注释的使用。 + *
+ * 这个类提供了一些基本功能。 + * + * @author 作者名 + * @version 1.0 + * @since 1.0 + */ +``` + +## 完整的示例 + +我们以hello world案例为主,给相关代码加上注释,我们在编译运行测试一下,看看注释是否会影响运行结果 + +```java +/** + * HelloWorld的测试类 + * + * @author huangSir + * @version 1.0 + * @since 1.0 + */ +public class HelloWorld{ + /* + 这是main方法,程序的入口 + */ + public static void main(String[] args){ + //方法体,打印hello world + System.out.println("hello world"); + } +} +``` + +编译运行 + +```cmd +PS C:\java-study\day01\src> javac HelloWorld.java +PS C:\java-study\day01\src> java HelloWorld +hello world +``` + +我们发现注释并不会影响程序的结果,后面学习中,我们可以多使用注释提升学习质量哦 \ No newline at end of file diff --git "a/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/images/image-20240905193121076.png" "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/images/image-20240905193121076.png" new file mode 100644 index 0000000000000000000000000000000000000000..c2f4a15fb63b5088337422750d89316a6c6eaa3e Binary files /dev/null and "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/images/image-20240905193121076.png" differ diff --git "a/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/images/image-20240905193349757.png" "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/images/image-20240905193349757.png" new file mode 100644 index 0000000000000000000000000000000000000000..b81b5ac6058ef14bdb2cbb5a620b3b0e48121d8b Binary files /dev/null and "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/images/image-20240905193349757.png" differ diff --git "a/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/images/image-20240905194447393.png" "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/images/image-20240905194447393.png" new file mode 100644 index 0000000000000000000000000000000000000000..e9aeacfdca5e7bf6b752a0b1e888cb105a1f5890 Binary files /dev/null and "b/java\344\273\216\345\205\245\351\227\250\345\210\260\346\224\276\345\274\203/javaSE\345\237\272\347\241\200/images/image-20240905194447393.png" differ