你不知道的 Java:那些原理不为人知却总是被使用的“黑科技” — 截至 Java 语言版本 1.8
我的语言 Java 今年 23 岁,完美的程序设计材料,完美的 OOP语言,但在我手里却是个超辣鸡的干物 lang。经常看到看不懂的语法、重复的代码、假装会用的泛型,不断 Ctrl - C; Ctrl - V 抄改别人的代码,可是莫名其妙地无法停下来啊!!!
然而 Java 在这里的一切她生活中的秘密,作为主人的我并不知道,推倒了居住在同一栋楼的天然少女 C++,以及无意间来到我家的冷酷少女 Haskell 后,我会发现 Java 的真实面目吗?[0]
Java 是什么?Java 是领先全球的计算机程序设计技术之一。
以下资源若无特别提及 Java 的语言版本,则默认指 Java 8 的语法 / 特性 / 概念… 如果有不准确但不影响理解的内容,则按照一般约定理解。
Java 是一门程序设计语言,它更是一个软件开发平台,根据平台的组成部分、主要业务领域区分,Java 技术体系可以被分为 4 个子体系:
Java 开发平台提供了以 Java 程序设计语言为核心的 完整跨平台程序设计开发工具链,并且,它被广泛地应用于桌面程序、服务器程序、移动终端、大型计算机等场合。
Sun 定义的 Java 技术体系包含以下项目:
new
创建,不可能被访问时自动丢弃。
native
方法来取代,并且移除了 C++ 里的操作符重载和多继承,用 interface
接口规范定义取代。
enum
、值类型自动装箱拆箱、基于泛型擦除的泛型检查、不定长参数、foreach (for (VarModifier TypedVarId: Expression)
) 等特性,Java 技术进入了新时代。
Java 是个简单、面向对象、分布式、解释性、健壮、安全、与系统平台无关、可移植、高性能、多线程和动态灵活的编程语言
JVM 是一个虚拟机,它是 Java 和众多其他 JVM 语言的运行环境,它允许自己的本地计算机执行 Java 字节码
知名的 JVM 语言包括
class
, object
, companion object
)、扩展函数、typealias
、面向对象 mix-in、first-class 面向对象代理、属性(property)、密封类(sealed class
)、数据类(data class
)和数据类解构赋值、注解类(annotation class
)、internal
访问限制、lateinit var
实例字段属性、闭包(lambda)、高阶函数、尾递归、灵活控制流(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
内联实现真泛型
Apache Groovy 是一个可选类型、动态性强的语言,它有着静态类型和静态编译的能力,旨在通过提供简洁、符合习惯、易读、易学语法的方式提高 JVM 开发人员的工作效率。
它和任何 Java 程序都良好兼容,并且可以在极短的时间里让你的应用拥有强大的功能 — 脚本支持、DSL 支持,函数式编程、编译期和运行期的元编程。
java.*
标准库)时至今日,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 扮演着游戏主持者的角色,赋予了计算以新的复杂性可能。
以上内容部分信息来自《深入理解 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 早就有 enum
和 assert
了;Oak 的 exceptions 可以不强制检查(unchecked);利用 unprotect
关键字异步异常(比如说系统的 SIGINT,ThreadDeath)可以不处理、Oak 支持契约式编程(比如,给子类继承的方法前置逻辑)
[4]排除增强类型系统安全检查强度和动态检查、运行时异常外;使用中间码,这也是属于见仁见智的问题,实际上,使用平台无关(全平台兼容)的中间代码作为最终的『二进制』形式而不是直接翻译到机器代码,最开始也给 Java 程序的执行带来了一些问题(虽然现在 Java 的选择也显得越来越符合“时代潮流”了),但是,语言“最终”的代码形式只是一个选择是否合适、是否符合定位的问题,不存在优劣之分。
一般都用 [.]
来引用论文、^.
做注释,不过这里不会引用任何论文,所以就拿它当 footnote 注释用了
capture<…>
in Java)*
类型参数invokedynamic
和 Lambda、Runtime Desugar 有啥关系 (Android)
->
lambda:匿名子类的语法糖、Kotlin 的 SAM interface 自动实现final
局部变量问题、Ruby、Python、C# 里的等价物invokedynamic
支持class
和 Qualified instance creationjava.lang.Annotation
Thread
,Green threads、LWPs、Fibers,volatile
和 synchronized
同步@interface
声明类assert
断言语句&
多接口实现约束strictfp
IEEE 754 兼容浮点数约束和 transient
无序列化修饰package-info.java
给包加上 JavaDocthis
和 super
new Ast.Leaf<Integer>(1) { @Override protected Integer eval() {return obj;} }
for
、while
、break
和 continue
final
本地变量修饰符Annotation
实例作为参数的 Annotation
T Class<T>.cast(Object);
静态方法排名不分先后。这是一个集合,而且当然是无序的
<ruby>
notation 的风格就是从这里来的~写着玩玩呗,而且有时候读书:每有会意便欣然忘食
明明是自己忘了吃饭,可是还埋怨书和代码使得自己会意了… (¬_¬)
于是带着报复社会的心态,决定给它写出来,而且简化一点尝试使它更容易读懂
— 既然一个人不吃饭… 那就大家都不吃! ( ̄‿ ̄)✧
此许可证应用到文中所有由 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.
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
See Typesetting.md! 😉