diff --git a/README.md b/README.md index 960129d..c2ba089 100644 --- a/README.md +++ b/README.md @@ -84,53 +84,3 @@ Caused by: java.lang.ClassNotFoundException: com.xfoss.learningJava.PhraseOMatic Kotlin DSL, 领域特定语言,Domain Specific Language > 参考: [Kotlin 之美 -- DSL 篇](https://juejin.cn/post/6844903569372479501) - - -## 目录 - -### 基础 - - -- [类与对象:对象村之旅](docs/Ch02_Class_and_Object_A_Trip_to_Objectville.md) -- [原生与引用:熟知你的变量](docs/Ch03_Primitives_and_References_Know_Your_Variables.md) -- [方法对实例变量的使用:对象的行为方式](docs/Ch04_Methods_Use_Instance_Variables_How_Objects_Behave.md) -- [实战编程:给方法赋能](docs/Ch05_Writing_a_Program_Extra-Strength_Methods.md) -- [了解Java API:使用Java的库](docs/Ch06_Get_to_Know_The_Java_API_Using_the_Java_Library.md) - -### 继承和多态机制 - - -- [继承与多态:追求对象村的更好生活](docs/Ch07_Inheritance_and_Polymorphism_Better_Living_in_Objectville.md) -- [接口与抽象类](docs/Ch08_Interfaces_and_Abstract_Classes.md) - -### 编译器、堆与栈 - - -- [构造器与垃圾回收: 对象的生与死](docs/Ch09_Constructors_and_Garbage_Collection_Life_and_Death_of_an_Object.md) -- [数字与静态值:数字为要](docs/Ch10_Numbers_and_Statics_Numbers_Matter.md) -- [例外处理:危险行为](docs/Ch11_Exception_Handling_Risky_Behavior.md) - -### GUI - - -- [获得GUI:一个甚为形象的故事](docs/Ch12_Getting_GUI_A_Very_Graphic_Story.md) -- [运用 `Swing`: 在 `Swing` 上干活](docs/Ch13_Using_Swing_Work_on_Your_Swing.md) - -### 对象序列化与数据结构 - - -- [对象序列化与文件的输入/输出:对象保存](docs/Ch14_Serialization_and_File_I_O_Saving_Objects.md) -- [联网与线程:构造连接](docs/Ch15_Networking_and_Threads_Make_a_Connection.md) -- [集合与泛型:数据结构](docs/Ch16_Collections_and_Generics_Data_Structure.md) - -### 完结 - - -- [打包、JARS与部署:发布代码](docs/Ch17_Package_JARs_And_Deployment_Release_Your_Code.md) -- [使用 RMI 特性进行远端部署:分布式计算](docs/Ch18_Remote_Deployment_with_RMI_Distributed_Computing.md) - -### 附录 - - -- [附录 A:十个本书未列入正式章节的方面](docs/Ch19_Appendix.md) -- [附录 B: 其他要点](docs/Ch20_Appendix_B.md) diff --git a/append_end.sh b/append_end.sh new file mode 100644 index 0000000..32e6d38 --- /dev/null +++ b/append_end.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +PWD="$(pwd)" +for f in $(find "src/" -type f -name "*.md" ); do + if [[ "${f}" == *"SUMMARY"* ]] || [[ "${f}" == *"README"* ]]; then continue; fi + echo -e "\n\n(End)\n\n" >> "$PWD/$f" +done diff --git a/src/404.md b/src/404.md index 81e2d94..b8bfba5 100644 --- a/src/404.md +++ b/src/404.md @@ -7,3 +7,8 @@ This URL is invalid, sorry. Please use the navigation bar or search to continue. It will be redirected to home in n seconds... + + +(End) + + diff --git a/src/Ch01_Dive_in_A_Quick_Dip_Breaking_the_Surface.md b/src/Ch01_Dive_in_A_Quick_Dip_Breaking_the_Surface.md index f187253..e4f0326 100644 --- a/src/Ch01_Dive_in_A_Quick_Dip_Breaking_the_Surface.md +++ b/src/Ch01_Dive_in_A_Quick_Dip_Breaking_the_Surface.md @@ -1 +1,6 @@ Ch01_Dive_in_A_Quick_Dip_Breaking_the_Surface.md + + +(End) + + diff --git a/src/Ch02_Class_and_Objects_A_Trip_to_Objectville.md b/src/Ch02_Class_and_Objects_A_Trip_to_Objectville.md index 69db0ca..fe60f87 100644 --- a/src/Ch02_Class_and_Objects_A_Trip_to_Objectville.md +++ b/src/Ch02_Class_and_Objects_A_Trip_to_Objectville.md @@ -10,3 +10,8 @@ * 用来对类进行 **测试**(用在 `TestDrive` 中, to **test** your real class) * 用来 **启动** Java **应用** (to **launch/start** your Java **application**) + + +(End) + + diff --git a/src/Ch03_Primitives_and_References_Know_Your_Variables.md b/src/Ch03_Primitives_and_References_Know_Your_Variables.md index 1dadca5..5246533 100644 --- a/src/Ch03_Primitives_and_References_Know_Your_Variables.md +++ b/src/Ch03_Primitives_and_References_Know_Your_Variables.md @@ -148,3 +148,8 @@ __对象引用__ 只是另一个变量值(An object reference is just another * `null` 是一个值,表示空指针,在某个对象被赋值了空指针后,就失去了对原来对象的引用,原来那个对象,就再也访问不到了,将被垃圾回收 * 两个对象引用变量,可以指向同一个对象 * 失去了对象引用变量的对象,将被垃圾回收 + + +(End) + + diff --git a/src/Ch04_Methods_Use_Instance_Variables_How_Objects_Behave.md b/src/Ch04_Methods_Use_Instance_Variables_How_Objects_Behave.md index b4fa8ec..7ff6a85 100644 --- a/src/Ch04_Methods_Use_Instance_Variables_How_Objects_Behave.md +++ b/src/Ch04_Methods_Use_Instance_Variables_How_Objects_Behave.md @@ -98,3 +98,8 @@ if (b == c) { // false } | 可以有多个参数 | 方法 | | 有助于建立良好封装的。 | 访问器,修改器,`public`, `private` | | 总是独行的(I always fly solo)。 | `return` | + + +(End) + + diff --git a/src/Ch05_Writing_a_Program_Extra-Strength_Methods.md b/src/Ch05_Writing_a_Program_Extra-Strength_Methods.md index ab08ebf..e167aa4 100644 --- a/src/Ch05_Writing_a_Program_Extra-Strength_Methods.md +++ b/src/Ch05_Writing_a_Program_Extra-Strength_Methods.md @@ -253,3 +253,8 @@ public class Output { > > - [在类中创建自己的对象](https://blog.csdn.net/qq_38374633/article/details/103977097) > - [Can a Class instantiate itself?](https://stackoverflow.com/questions/18241281/can-a-class-instantiate-itself) + + +(End) + + diff --git a/src/Ch06_Get_to_Know_The_Java_API_Using_the_Java_Library.md b/src/Ch06_Get_to_Know_The_Java_API_Using_the_Java_Library.md index 848c4cf..53a834a 100644 --- a/src/Ch06_Get_to_Know_The_Java_API_Using_the_Java_Library.md +++ b/src/Ch06_Get_to_Know_The_Java_API_Using_the_Java_Library.md @@ -311,3 +311,8 @@ you'll just have to type Java 本身就有着一套良好的线上文档,名字就叫 Java API。这套文档又是另外一套更大的名为 Java 5 标准版文档的一部分,这些线上文档还必须得去单独下载;这些文档不是和 Java 程序一起提供的。 这些API文档,在要进一步了解某个类及其方法时,最好的参考资料。比如在查阅参考书时,在 `java.util`包中发现一个名为 `Calendar` 的类时,参考书只能告诉你这个类的有限的、仅能让你明白这个类正是你要用到的一点点内容,在你需要了解更多的有关这个类的信息时,就可以在线上文档里找到。 + + +(End) + + diff --git a/src/Ch07_Inheritance_and_Polymorphism_Better_Living_in_Objectville.md b/src/Ch07_Inheritance_and_Polymorphism_Better_Living_in_Objectville.md index 714e9dd..e1864be 100644 --- a/src/Ch07_Inheritance_and_Polymorphism_Better_Living_in_Objectville.md +++ b/src/Ch07_Inheritance_and_Polymorphism_Better_Living_in_Objectville.md @@ -503,3 +503,8 @@ public class Overloads { } } ``` + + +(End) + + diff --git a/src/Ch08_Interfaces_and_Abstract_Classes.md b/src/Ch08_Interfaces_and_Abstract_Classes.md index 1c7cc45..b5de45b 100644 --- a/src/Ch08_Interfaces_and_Abstract_Classes.md +++ b/src/Ch08_Interfaces_and_Abstract_Classes.md @@ -707,3 +707,8 @@ public class Dog extends Canine implements Pet * 类可以实现多个 `interface`s; * 因为 *`interface`的全部方法,隐式的都是 `public` 与 `abstract` 的*,所以实现某个 `interface` 的类,就必须实现该 `interface` 的全部方法; * 使用关键字 `super` 来从子类中调用所重写方法的超类版本。比如 `super.runReport();` + + +(End) + + diff --git a/src/Ch09_Constructors_and_Garbage_Collection_Life_and_Death_of_an_Object.md b/src/Ch09_Constructors_and_Garbage_Collection_Life_and_Death_of_an_Object.md index 36c4694..89000f9 100644 --- a/src/Ch09_Constructors_and_Garbage_Collection_Life_and_Death_of_an_Object.md +++ b/src/Ch09_Constructors_and_Garbage_Collection_Life_and_Death_of_an_Object.md @@ -650,3 +650,8 @@ Buffy *图 22 - 对象回收:引用变量永久脱离作用范围* + + +(End) + + diff --git a/src/Ch10_Numbers_and_Statics_Numbers_Matter.md b/src/Ch10_Numbers_and_Statics_Numbers_Matter.md index e86a49b..f362be5 100644 --- a/src/Ch10_Numbers_and_Statics_Numbers_Matter.md +++ b/src/Ch10_Numbers_and_Statics_Numbers_Matter.md @@ -1248,3 +1248,8 @@ class WithStatic { * **IV**:静态方法是这中间最糟糕的了,因为使用静态方法常常意味着程序员是在进行过程思维,而没有以对象按照对象的独有状态来行事。 * **SV**:当然,我知道应该把对象作为面向对象涉及的焦点,但正是由于有那么些无知的程序员......请不要全盘否定过程编程好吧。静态变量/方法仍然有其存在的必要,同时在需要到他们时,他们可以说是无可比拟的(don't throw the baby out with the bytecode. There's a time and place for statics, and when you need one, nothing else beats it)。 * **IV**:好吧......你就自欺欺人吧(Riiiiiight. Whatever you need to tell yourself...) + + +(End) + + diff --git a/src/Ch11_Exception_Handling_Risky_Behavior.md b/src/Ch11_Exception_Handling_Risky_Behavior.md index 5630fac..c80fe52 100644 --- a/src/Ch11_Exception_Handling_Risky_Behavior.md +++ b/src/Ch11_Exception_Handling_Risky_Behavior.md @@ -980,3 +980,8 @@ MIDI 消息保存了 MIDI 事件中指出要做什么的部分。即要音序器 *图 20 - 第14章的`BeatBox` app:保存与恢复* + + +(End) + + diff --git a/src/Ch12_Getting_GUI_A_Very_Graphic_Story.md b/src/Ch12_Getting_GUI_A_Very_Graphic_Story.md index 03079bf..3c5dffb 100644 --- a/src/Ch12_Getting_GUI_A_Very_Graphic_Story.md +++ b/src/Ch12_Getting_GUI_A_Very_Graphic_Story.md @@ -1765,3 +1765,8 @@ public class MiniMusicPlayer3 { *图 28 - Java GUI 内部类与非 GUI 事件的监听:`MiniMusicPlayer` 完成效果* + + +(End) + + diff --git a/src/Ch13_Using_Swing_Work_on_Your_Swing.md b/src/Ch13_Using_Swing_Work_on_Your_Swing.md index db5bf5c..cb390e7 100644 --- a/src/Ch13_Using_Swing_Work_on_Your_Swing.md +++ b/src/Ch13_Using_Swing_Work_on_Your_Swing.md @@ -1199,3 +1199,8 @@ public class BeatBox { *图 28 - `BeatBox` app 第一版* + + +(End) + + diff --git a/src/Ch14_Serialization_and_File_I_O_Saving_Objects.md b/src/Ch14_Serialization_and_File_I_O_Saving_Objects.md index ff79e38..269e99f 100644 --- a/src/Ch14_Serialization_and_File_I_O_Saving_Objects.md +++ b/src/Ch14_Serialization_and_File_I_O_Saving_Objects.md @@ -1523,3 +1523,8 @@ class ReadInPatternListener implements ActionListener { 此版本有着巨大局限!在点击了 "对其序列化" 按钮时,程序将自动进行序列化操作,到一个名为“pattern.ser”的文件(若该文件不存在,就会被创建出来)。不过在每次保存时,都将覆写先前保存的文件。 请通过结合 `JFileChooser`,对这里的保存与恢复特性加以改进,从而可以随意命名,并保存出许多不同的曲目,同时还能够从先前所保存的文件,加载/恢复出 *任意* 的曲目。 + + +(End) + + diff --git a/src/Ch15_Networking_and_Threads_Make_a_Connection.md b/src/Ch15_Networking_and_Threads_Make_a_Connection.md index 6f5e47a..bb771c1 100644 --- a/src/Ch15_Networking_and_Threads_Make_a_Connection.md +++ b/src/Ch15_Networking_and_Threads_Make_a_Connection.md @@ -2950,3 +2950,8 @@ public class MusicServer { } } ``` + + +(End) + + diff --git a/src/Ch16_Collections_and_Generics_Data_Structure.md b/src/Ch16_Collections_and_Generics_Data_Structure.md index fa3c52b..139ee81 100644 --- a/src/Ch16_Collections_and_Generics_Data_Structure.md +++ b/src/Ch16_Collections_and_Generics_Data_Structure.md @@ -1917,3 +1917,8 @@ public void takeThing(ArrayList one, ArrayList two) ```java public void takeThing(ArrayList one, ArrayList two) ``` + + +(End) + + diff --git a/src/Ch17_Package_JARs_and_Deployment_Release_Your_Code.md b/src/Ch17_Package_JARs_and_Deployment_Release_Your_Code.md index f9e2ac0..7268b77 100644 --- a/src/Ch17_Package_JARs_and_Deployment_Release_Your_Code.md +++ b/src/Ch17_Package_JARs_and_Deployment_Release_Your_Code.md @@ -1 +1,6 @@ # 打包、JARs 与部署:发布代码 + + +(End) + + diff --git a/src/Ch17_Package_Jars_and_Deployment_Release_Your_Code.md b/src/Ch17_Package_Jars_and_Deployment_Release_Your_Code.md index f9e2ac0..7268b77 100644 --- a/src/Ch17_Package_Jars_and_Deployment_Release_Your_Code.md +++ b/src/Ch17_Package_Jars_and_Deployment_Release_Your_Code.md @@ -1 +1,6 @@ # 打包、JARs 与部署:发布代码 + + +(End) + + diff --git a/src/Ch18_Remote_Deployment_with_RMI_Distributed_Computing.md b/src/Ch18_Remote_Deployment_with_RMI_Distributed_Computing.md index 0f7a51f..9e45d5f 100644 --- a/src/Ch18_Remote_Deployment_with_RMI_Distributed_Computing.md +++ b/src/Ch18_Remote_Deployment_with_RMI_Distributed_Computing.md @@ -7,3 +7,8 @@ > *Everyone says long-distance relationships are hard, but with RMI, it's easy. No matter how far apart we *really* are, RMI makes it seem like we're together*. **隔得远远的并不一定有什么不好(Being remote doesn't have to be a bad thing)**。 + + +(End) + + diff --git a/src/Ch19_Appendix_A.md b/src/Ch19_Appendix_A.md index 03f5139..47dd7ec 100644 --- a/src/Ch19_Appendix_A.md +++ b/src/Ch19_Appendix_A.md @@ -653,3 +653,8 @@ PHIL, 他的乐器是:bass, 他演唱的是:occasionally ``` > 请注意,只有在枚举值没有“常量专用类代码体(constant-specific class body)”的时候,才会调用到那个基本的 `sing()` 方法。 + + +(End) + + diff --git a/src/Ch20_Appendix_B.md b/src/Ch20_Appendix_B.md index bad9726..9f10c1e 100644 --- a/src/Ch20_Appendix_B.md +++ b/src/Ch20_Appendix_B.md @@ -1637,3 +1637,8 @@ method3 ------------------ 私有方法被调用了 ``` + + +(End) + + diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..924fd6e --- /dev/null +++ b/src/README.md @@ -0,0 +1,88 @@ +# Java 编程学习项目 ☕️ + + +这是一个学习 Java 的项目。使用 Eclipse IDE/VIM、Gradle/NPM 构建工具。后期会涉及到 NPM 的使用。主要学习 Java 的基础知识,Java 本地应用程序的编写。 __项目使用 JDK `11.0.12`__ 语言环境。 + +在线阅读:[java.xfoss.com](https://java.xfoss.com)。 + +本地阅读:[`mdbook` 本地运行](./src/howto_read_locally.md) + +--- + +## 0. 环境搭建 + +本项目是在 Ubuntu Linux 20.04 LTS 上进行的。 + + +- 安装JDK + + JDK的当前LTS版是 `JDK 17.0.1`(Oracle, 2021-11),你可以直接从 [Java Downloads | jdk.java.net](https://jdk.java.net/java-se-ri/11) 下载。openjdk-11+28_linux-x64_bin.tar.gz` 压缩包有 178.9M 大小。 + + 运行下面的命令,就安装好 OpenJDK 了。 + +```bash +$sudo tar xf /path/to/openjdk-11+28_linux-x64_bin.tar.gz -C /opt/ +$sudo ln -s /opt/openjdk-11+28 /opt/jdk +$sudo update-alternatives --install "/usr/bin/java" "java" "/opt/jdk/bin/java" 1 +$sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/jdk/bin/javac" 1 +``` + +运行 `$java -version` 与 `$javac -version` 测试 JDK 是否安装妥当。 + +- 安装 [Gradle](https://gradle.org/) + + 参考 Gradle 官网上使用 [SDKMAN!](http://sdkman.io/) 直接安装即可。 + +- 安装Maven + + [Apache Maven](http://maven.apache.org/) 可以直接下载,下载到的 `apache-maven-3.8.4-bin.tar.gz`压缩包,大小约 9M,安装步骤与JDK的略有不同: + +```bash +$sudo tar xf /path/to/apache-maven-3.8.4-bin.tar.gz -C /opt/ +$sudo ln -s /opt/apache-maven-3.8.4 /opt/mvn +$sudo vim.gtk /etc/profile.d/mvn.sh +$sudo chmod +x /etc/profile.d/mvn.sh +``` + +其中建立了一个 `/etc/profile.d/mvn.sh` 文件,并修改为了可执行文件。该文件的内容为: + +```sh +export JAVA_HOME=/opt/jdk +export M2_HOME=/opt/mvn +export MAVEN_HOME=/opt/mvn +export PATH=${M2_HOME}/bin:${PATH} +``` + +随后可将国内的华为 MAVEN 代码仓库,设置为MAVEN的默认代码仓库。运行如下命令: + +```bash +$if [ -d $HOME"/.m2" ]; then :; else echo "~/.abc not exist. Now create"; mkdir $HOME"/.m2"; fi +$wget -qO ~/.m2/settings.xml https://mirrors.huaweicloud.com/api/v1/configurations/maven? +``` + +- 安装NVM +- 配置 `~/.vimrc` + +## 1. 关于文件/目录结构 + +在编写 Java 程序时,使用 Maven 构建,必须以这样的 `src/main/java/com/xfoss/learningJava/*.java` 的文件/目录结构,否则会报错: + +```bash +peng@uDesktop:~/eclipse-workspace/learningJava$ java -jar target/com.xfoss.learningJava-0.0.1.jar +Error: Could not find or load main class com.xfoss.learningJava.PhraseOMatic +Caused by: java.lang.ClassNotFoundException: com.xfoss.learningJava.PhraseOMatic +``` + +> 同时,`packege com.xfoss.com.learningJava;` 对应的包 `com.xfoss.learningJava` 必须以这个名字命名,这也是上面目录中 `/com/xfoss/learningJava` 的来源。 + +## 2. 使用 `exec-maven-plugin` + +使用这个插件,可以开启 `mvn exec:java` 命令,实时运行(正在)编写的 Java 程序。该插件支持两种运行模式,一种是在 Maven 所在线程里运行(需要修改 MAVEN 运行参数 `export MAVEN_OPTS=-Xmx1024m`,以增加JVM虚拟机的运行内存);另一种以独立线程运行(尚需测试)。 + +## 3. `build.gradle.kts` 文件中的 kotlin dsl 语法 + +Kotlin DSL, 领域特定语言,Domain Specific Language + +> 参考: [Kotlin 之美 -- DSL 篇](https://juejin.cn/post/6844903569372479501) + +{{#include ./SUMMARY.md:5:}} diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 3e8816e..161c3ef 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -1,4 +1,4 @@ -[轻松学Java(Head First Java)](../README.md) +[轻松学Java(Head First Java)](README.md) --- diff --git a/src/howto_read_locally.md b/src/howto_read_locally.md index 9d33206..4960162 100644 --- a/src/howto_read_locally.md +++ b/src/howto_read_locally.md @@ -39,3 +39,8 @@ mdbook serve ~/rust-lang-zh_CN -p 8080 -n 127.0.0.1 --open > 注:当在 Windows 系统上时,咱们要在 `msys2` 的终端窗口中运行此命令。 此时,将在操作系统的默认浏览器中,打开本书。 + + +(End) + + diff --git a/src/images/alipay-laxers.jpeg b/src/images/alipay-laxers.jpeg new file mode 100644 index 0000000..6dcd658 Binary files /dev/null and b/src/images/alipay-laxers.jpeg differ diff --git a/src/images/wechat-pay-hector.jpeg b/src/images/wechat-pay-hector.jpeg new file mode 100755 index 0000000..4a595d3 Binary files /dev/null and b/src/images/wechat-pay-hector.jpeg differ diff --git a/theme/index.hbs b/theme/index.hbs index d2bf38a..1ba35ce 100644 --- a/theme/index.hbs +++ b/theme/index.hbs @@ -37,6 +37,8 @@ {{#if copy_fonts}} {{/if}} + + @@ -52,6 +54,33 @@ {{/if}} + +
@@ -154,10 +183,8 @@ - {{/if}} ・ - - 打赏,donate - + {{/if}} +
@@ -296,9 +323,33 @@ {{/if}} - - + + +

小额打赏,赞助 xfoss.com 长存......

+ +
+ 微信 | + 支付宝 + +
+
+ +
+
+ +
+
+
+ +
+

若这里内容有帮助到你,请选择上述方式向 xfoss.com 捐赠。

+ +
+ + + + + + + + + +