Java You-Dont-Know你不知道的 Java badge-handwrote badge-javaversion

Java You Dont Know

你不知道的 Java:那些原理不为人知却总是被使用的“黑科技” — 截至 Java 语言版本 1.8

我的语言 Java 今年 23 岁,完美的程序设计材料,完美的 OOP面向对象编程语言,但在我手里却是个超辣鸡的干物 lang。经常看到看不懂的语法、重复的代码、假装会用的泛型,不断 Ctrl - C; Ctrl - V 抄改别人的代码,可是莫名其妙地无法停下来啊!!!
然而 Java 在这里的一切她生活中的秘密,作为主人的我并不知道,zhōngchū了居住在同一栋楼的天然少女 C++,以及无意间来到我家的冷酷少女 Haskell 后,我会发现 Java 的真实面目吗?[0]

Java 是什么?Java 是领先全球的计算机程序设计技术之一。

以下资源若无特别提及 Java 的语言版本,则默认指 Java 8 的语法 / 特性 / 概念… 如果有不准确但不影响理解的内容,则按照一般约定理解。

Java 是一门程序设计语言,它更是一个软件开发平台,根据平台的组成部分、主要业务领域区分,Java 技术体系可以被分为 4 个子体系:

JavaSE 8 技术栈 JavaSE Tech Stack

Java 开发平台提供了以 Java 程序设计语言为核心的 完整跨平台程序设计开发工具链,并且,它被广泛地应用于桌面程序、服务器程序、移动终端、大型计算机等场合。

Sun 定义的 Java 技术体系包含以下项目:

Java 程序设计语言
Java 程序设计语言是 Java 开发平台的 灵魂

Java 是一门 强类型、静态检查、显式类型 的“低糖”语言,它支持面向对象编程、面向对象多态、并发编程、事件驱动、反射元编程、泛型编程、Annotation 处理,当然,也包含基本的函数式编程递归支持

Java 是使用自动内存管理的程序设计语言,这意味着,你不需要考虑如何为这门语言的『值』分配内存空间。 Java 的对象会在需要时被 new 创建,不可能被访问时自动丢弃。

Java 很大程度上类似 C++,但没有采用 C++ 的『指针』模型,只支持『可空nullable引用和提供 native 方法来取代,并且移除了 C++ 里的操作符重载多继承,用 interface 接口规范定义取代。
Java 1.5 以来,Java 引入了类型安全的 enum、值类型自动装箱拆箱、基于泛型擦除的泛型检查、不定长参数、foreach (for (VarModifier TypedVarId: Expression)) 等特性,Java 技术进入了新时代。

Sun Microsystems 这么描述 Java:
Java 是个简单、面向对象、分布式、解释性、健壮、安全、与系统平台无关、可移植、高性能、多线程和动态灵活的编程语言

Class 文件格式(Java 字节码格式)

Java 虚拟机(在各种实际硬件和操作系统平台上的实现)

JVM 是一个虚拟机,它是 Java 和众多其他 JVM 语言的运行环境,它允许自己的本地native计算机执行 Java 字节码
知名的 JVM 语言包括

  • Java (Oracle Java, formerly Sun Java)

  • Java 是一种通用编程语言,它的代码基于类,实现面向对象编程(虽然不是纯 OO 语言,因为它包含基本类型primitive types, likely int),并且设计为使尽可能减少强耦合程序。 它旨在让应用程序开发人员编写一次,在任何地方运行("WORA"),这意味着编译的 Java 代码可以在所有支持 Java 的平台上运行而无需重新编译。
  • Kotlin (JetBrains)

  • 发展迅速的 JVM 编程语言;其名字源自于俄罗斯圣彼得堡的一座小岛科特林
    Kotlin 于 2011 年被 JetBrains (知名的开发工具公司)谋划并于 2012 年开源其第一个编译工具版本,现在已经有 JVM, JavaScript(Plain, AMD, UMD, CommonJS), Native 等多种目标语言的编译实现
    Kotlin 受 Java, Groovy, Scala, C#, Gosu 等语言启发

    Kotlin 支持可空类型系统、Bottom Type、闭包、类型投影等 Java 严重缺失的概念,语言本身比 Java 更富语法糖化,同样的程序甚至完全相同的控制结构算法,用 Kotlin 表达会更简短好看;Kotlin 简洁、安全、完全支持与 Java API 互操作、对语言工具(比如 IDE)友好
    Kotlin 是一个从来不缺特性的语言 — 协程、类型推导、完全面向对象(class, object, companion object)、扩展函数、typealias、面向对象 mix-in混入、first-class 面向对象代理、属性(property)、密封类(sealed class)、数据类(data class)和数据类解构赋值、注解类(annotation class)internal 访问限制、lateinit var 实例字段属性、闭包(lambda)、高阶函数、尾递归tailrec、灵活控制流(labled chunk)if 表达式、when 分支判断、内联(inline)方法和类、vararg、操作符重载、和 Object#equals 等价的 (==) 二元逻辑运算符、infix notation (e.g. to, until)、elvis (?:) 和 null 传导 (?.)、区间和 Pair、多行字符串、强制标识符合法化(val `#_#` = 0x0_0)、软化关键字(soft keywords)、in out 和声明处型变、reified 内联实现真泛型

    Kotlin 的编译器 kompiler 是开放可嵌入的,Gradle、Maven、Ant 和众多 IDE 工具皆可集成 Kotlin Compiler 进行代码生成分析的工作,这使得为 Kotlin 开发语言工具、集成到已有工具平台更为简单
    2017 年,Kotlin 1.0 版本发布以后的第一年,Google I/O 大会上宣布 Kotlin 成为 Android 开发的『官方』语言

    和 Scala 相比,Kotlin 是为工程师设计,更符合实际工程实践需要,语法类似 Java 和 Scala
    目前 Kotlin 已经成为 Android 开发的流行语言,被誉为 Android 平台的 Swift
    虽然是门『新语言』,Kotlin 的学习曲线极其平缓、学习量相当于学习一个新框架,只需要看几十行代码就可以扔掉 Java,开始学着使用 Kotlin 编程了
  • Groovy (Apache)
  • Apache Groovy 是一个可选类型、动态性强的语言,它有着静态类型和静态编译的能力,旨在通过提供简洁、符合习惯、易读、易学语法的方式提高 JVM 开发人员的工作效率。
    它和任何 Java 程序都良好兼容,并且可以在极短的时间里让你的应用拥有强大的功能 — 脚本支持、DSL 支持,函数式编程、编译期compile-time运行期run-time元编程

  • Scala
  • Clojure
  • JavaScript (Mozilla Rhino)
  • JavaScript (Oracle Nashorn) [at OpenJDK]
  • JRuby
  • Jython
  • BeanShell


Java 语言 API java.* 标准库)
Java 外部 API (来自商业机构和开源社区的第三方 Java 类库
我们把 Java 程序设计语言的基础工具、Java 虚拟机、Java API 这三部分统称为 JDK,它是进行 Java 软件开发的最小支持环境 我们也把 Java 虚拟机、JavaSE API (所有 Java API 的子集) 这两部分统称为 JRE,它是支持 Java 程序运行的基础环境
Java 版本历史 详情 Java Version History

时至今日,Java 技术已经吸引了 900 多万 名软件开发者,使用 Java 技术的设备多达 几十亿 台,包含众多智能卡、机顶盒、导航系统、游戏机和其他设备。[2]

由 Google 主导开发而领先世界且与 Apple 的 iOS 二分天下的移动操作系统平台,Android,Android 使用的软件开发技术,就是 Java 技术的一个衍生品。

1991 年,由 James Gosling 领导的 “Green Project” 项目启动,此计划的目的是开发一种能够在多种消费电子产品(比如游戏机、机顶盒、个人电脑等)上面运行的程序运行时和软件平台架构。这个架构就是 Java 的前身:Oak(橡树),它尝试扩展 C++,和早期的 Java 大同小异[3]

即便其前身 Oak 在市场上并不算成功,Java 的诞生正好赶上了那个无论软件需求量还是工程量都暴涨的网络时代 — 这个时代只接受同类软件中 第一个 弄出来的!

自从 1995 年的 Oak to Java,Java 在 SunWorld 大会上发布第一个版本 1.0 以来,Java 因为其强大的通用性、安全性、稳定性、可移植性、开发效率闻名于世。

Java 的领导者 James Gosling 博士从一开始就敏锐地注意到了其他开发平台不安全、时常出现严重的资源内存泄漏、缓冲区溢出、悬垂指针、并发数据竞争,处理复杂繁琐,开发效率低下、必须给不同硬件平台发布不同类型的软件包的问题[4],Java 及时地提出了 “Write Once, Run Anywhere” 这个口号。极高的开发效率和依此而生的极短开发时间,使 Java 成为网络时代的理想计算平台,从个人智能手机终端到网络服务器,Java 扮演着游戏主持者的角色,赋予了计算以新的复杂性可能。

1996 年 1 月 23 日,JDK 1.0 发布,Java 终于有了第一个正式版本的运行环境 JDK 1.0 提供了一个纯字节码解释器版本的实现 — _Sun Classic VM_ JDK 1.0 时期的 Java 技术包括 JVM、Applet、AWT 等 同年 4 月,10 个操作系统供应商声明将在其产品中嵌入 Java 技术 同年 5 月底,Sun 公司于美国旧金山举行了首届 JavaOne 大会,从此 JavaOne 大会成为世界 Java 开发者一年一度的技术盛会 同年 9 月,已经有 8.3 万网页使用了 Java 技术制作。 Java 1.1 发布和 Haskell 97 正好是同一年


以上内容部分信息来自《深入理解 Java 虚拟机》第二版,可以在豆瓣试读
RednaxelaFX对《深入理解Java虚拟机(第2版)》的笔记(6)

[0]详见 B 站《干物妹!小埋》《干雾妹小霾》

[1]ERP, 企业资源管理
CRM, 客户资源管理

[2]信息来自 java.com/zh_CN/about

[3]Oak 的 primitive number 包括 unsigned 无符号整数(考虑一下它受到了 C++ 启发);Oak 不存在 private 访问(private 是 package-private);Oak 早就有 enumassert 了;Oak 的 exceptions 可以不强制检查(unchecked);利用 unprotect 关键字异步异常(比如说系统的 SIGINTThreadDeath)可以不处理、Oak 支持契约式编程(比如,给子类继承的方法前置逻辑)

[4]排除增强类型系统安全检查强度和动态检查、运行时异常外;使用中间码intermediate language,这也是属于见仁见智的问题,实际上,使用平台无关(全平台兼容)的中间代码作为最终的『二进制』形式而不是直接翻译到机器代码,最开始也给 Java 程序的执行带来了一些问题(虽然现在 Java 的选择也显得越来越符合“时代潮流”了),但是,语言“最终”的代码形式只是一个选择是否合适、是否符合定位的问题,不存在优劣之分。

一般都用 [.] 来引用论文、^. 做注释,不过这里不会引用任何论文,所以就拿它当 footnote 注释用了

Contents 内容

Thanks 特别感谢

排名不分先后。这是一个集合set,而且当然是无序

Motivation 写作动机

写着玩玩呗,而且有时候读书:每有会意便欣然忘食

明明是自己忘了吃饭,可是还埋怨书和代码使得自己会意了… (¬_¬)

于是带着报复社会的心态,决定给它写出来,而且简化一点尝试使它更容易读懂

— 既然一个人不吃饭… 那就大家都不吃! ( ̄‿ ̄)✧

Licence 许可证

此许可证应用到文中所有由 duangsuse 编写的 示例代码

MIT License

Copyright (c) 2019 duangsuse's code

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Development: Setup Jekyll

pushd Java-You-Dont-Know

git checkout -b gh-pages

print>Gemfile \
  "source \'https://rubygems.org\'" \
  "\ngem \'github-pages\', group: :jekyll_plugins"

bundle install
bundle exec jekyll serve

git checkout master
popd

Development: Markdown Inline Typesetting tests 内联排版测试

See Typesetting.md! 😉