在 JEP222 ( JShell,Java9 )和 JEP330 ( Java11 )实装后,Java 可以很方便地用 REPL 解释执行,也可以使用带 Shebang 的小脚本,如
#!/usr/bin/env java --source 11
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
而对于现代的编程语言,关于编译执行和解释执行的分类已经变得越来越模糊了,大多数的编程语言都加上了 JIT,而传统的编译型语言也为语言加上了能够解释执行的“快捷方式”。
var
,Java 就变成动态语言了var
是一个方便使用的语法糖,编译器帮忙推导出了静态类型,不会导致 Java 变成动态语言。
值得关注的是,类型推导已经是现代编程语言的共同特性,很多静态类型的编程语言都已经装备了这个特性。
为了兼容已有的代码,Java 实现了编译时泛型以及少量的运行时的泛型信息,或者说称之为擦除泛型。
Java 的泛型提高了程序的健壮性,但由于缺少一些特性也为人诟病,但称之为“假的泛型”是一种误解。事实上,越来越多的动态语言正在尝试增加“可擦除的类型系统”、类型注释( Type Hint ),用于提高程序的健壮性。
而 Java 的类型(泛型)系统已经被证明是不健全的( Unsound ),但由于 JVM 没有实现泛型,所以并没有因此影响 JVM 的可靠性。
这并不是 Java 应用分发的唯一方式,无论是古老的 GCJ ( 1998 ),还是近几年流行的 GraalVM Native Image,都可以将 Java 代码编译成一个原生系统支持的二进制程序,这能显著提高程序的启动速度和分发效率。
另一个选择是 JEP392 ( Java16 )带来的 jpackage tool,它能够帮助生成对应操作系统的安装包,解决应用程序分发的最后一公里问题。
com.sun.*
包里面的类了大多数com.sun.*
的包都是供 JDK 内部使用的,这些包在 JEP403 ( Java17 )后将无法再被外部的类使用,但仍然存在少部分模块的公共类是在包com.sun.*
下,且可以被外部的类导入使用,只不过对它们的反射行为被禁止了。
Java 和 JavaScript 名字很像,在历史和设计上也有一定的关系,两者使用了类似的语法,JavaScript 借鉴了 Java 少量 API 和编码风格,同时 JavaScript 在设计之初特意避开了设计class
以免和 Java 相像。
Java 和 JavaScript 的商标都在甲骨文( Oracle )手中,所以如果使用 JavaScript 做宣传也可能被甲骨文法务找上门。
但除此之外,两者是两门相差很大的编程语言,它们有各自的工具链、应用领域、社区和演进路径。
JDK 从 1.6 开始提供 HTTP 模块com.sun.net.httpserver.HttpServer
,使用起来也同其他编程语言类似。
在 JEP408 中,将提供一个简易的命令行”Simple Web Server“,可以像 Python 那样python -m http.server
一键启用一个 Web 服务器。
低暂停时间和无暂停时间的的垃圾回收器已经被发明,如 OpenJDK 目前可以启用 ZGC 以降低 GC 的 STW 对应用的影响。
曾经是的,但是当前的 Java 社区倾向于使用 Java 语言或者 JVM 上的方言来书写配置,以取代过去的 XML 配置。
事实上,Android 平台并没有实现 Java 平台必要的设施,而是通过特殊的手段编译了 Java 的字节码,所以并不符合 Java 程序“一次编写,到处运行”的口号,也不能使用 Powered by Java 作宣传。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.