V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cbdy
V2EX  ›  Java

关于 Java 可能存在的 10 个误解(2021 版)

  •  1
     
  •   Cbdy · 2021-08-28 14:15:03 +08:00 · 3285 次点击
    这是一个创建于 943 天前的主题,其中的信息可能已经有所发展或是发生改变。

    关于 Java 可能存在的 10 个误解( 2021 版)

    1. Java 是编译型语言而不是解释型语言

    在 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,而传统的编译型语言也为语言加上了能够解释执行的“快捷方式”。


    2. 如果在 Java 代码中使用var,Java 就变成动态语言了

    var是一个方便使用的语法糖,编译器帮忙推导出了静态类型,不会导致 Java 变成动态语言。

    值得关注的是,类型推导已经是现代编程语言的共同特性,很多静态类型的编程语言都已经装备了这个特性。


    3. Java 的泛型是假泛型

    为了兼容已有的代码,Java 实现了编译时泛型以及少量的运行时的泛型信息,或者说称之为擦除泛型。

    Java 的泛型提高了程序的健壮性,但由于缺少一些特性也为人诟病,但称之为“假的泛型”是一种误解。事实上,越来越多的动态语言正在尝试增加“可擦除的类型系统”、类型注释( Type Hint ),用于提高程序的健壮性。

    而 Java 的类型(泛型)系统已经被证明是不健全的( Unsound ),但由于 JVM 没有实现泛型,所以并没有因此影响 JVM 的可靠性。


    4. Java 应用程序分发时必须携带 JVM,不能编译成原生系统支持的二进制程序

    这并不是 Java 应用分发的唯一方式,无论是古老的 GCJ ( 1998 ),还是近几年流行的 GraalVM Native Image,都可以将 Java 代码编译成一个原生系统支持的二进制程序,这能显著提高程序的启动速度和分发效率。

    另一个选择是 JEP392 ( Java16 )带来的 jpackage tool,它能够帮助生成对应操作系统的安装包,解决应用程序分发的最后一公里问题。


    5. Java17 之后,就不能使用com.sun.*包里面的类了

    大多数com.sun.*的包都是供 JDK 内部使用的,这些包在 JEP403 ( Java17 )后将无法再被外部的类使用,但仍然存在少部分模块的公共类是在包com.sun.*下,且可以被外部的类导入使用,只不过对它们的反射行为被禁止了。


    6. Java 和 JavaScript 之间完全没关系

    Java 和 JavaScript 名字很像,在历史和设计上也有一定的关系,两者使用了类似的语法,JavaScript 借鉴了 Java 少量 API 和编码风格,同时 JavaScript 在设计之初特意避开了设计class以免和 Java 相像。

    Java 和 JavaScript 的商标都在甲骨文( Oracle )手中,所以如果使用 JavaScript 做宣传也可能被甲骨文法务找上门。

    但除此之外,两者是两门相差很大的编程语言,它们有各自的工具链、应用领域、社区和演进路径。


    7. 使用 Java 写网站要依赖 Tomcat 等 HTTP 库

    JDK 从 1.6 开始提供 HTTP 模块com.sun.net.httpserver.HttpServer,使用起来也同其他编程语言类似。

    在 JEP408 中,将提供一个简易的命令行”Simple Web Server“,可以像 Python 那样python -m http.server一键启用一个 Web 服务器。

    8. Java 垃圾回收时,会产生糟糕的 STW,影响应用的运行

    低暂停时间和无暂停时间的的垃圾回收器已经被发明,如 OpenJDK 目前可以启用 ZGC 以降低 GC 的 STW 对应用的影响。


    9. 编写 Java 程序往往需要编写大量的 XML

    曾经是的,但是当前的 Java 社区倾向于使用 Java 语言或者 JVM 上的方言来书写配置,以取代过去的 XML 配置。


    10. Android 平台实现了 Java 平台

    事实上,Android 平台并没有实现 Java 平台必要的设施,而是通过特殊的手段编译了 Java 的字节码,所以并不符合 Java 程序“一次编写,到处运行”的口号,也不能使用 Powered by Java 作宣传。

    7 条回复    2021-08-29 10:41:11 +08:00
    liuxu
        1
    liuxu  
       2021-08-28 14:32:51 +08:00
    SEO 大佬
    AEDaydreamer
        2
    AEDaydreamer  
       2021-08-28 17:04:54 +08:00
    关于 JS 和 JAVA 的关系,《 JavaScript 二十年》第一章讲的很清楚,感兴趣的都可以看看
    Cbdy
        3
    Cbdy  
    OP
       2021-08-28 17:18:32 +08:00 via Android
    @AEDaydreamer 是的,上面说的有个地方不太对,不设计类是避免和 Java 竞争,那个时代正是面向对象风靡的时代,类被认为是一个强大而时髦的功能
    Oktfolio
        4
    Oktfolio  
       2021-08-28 18:55:50 +08:00
    11. Java 开发 Web 、Web API 开发效率低
    lysS
        5
    lysS  
       2021-08-28 19:55:49 +08:00
    一般的说法是将编译语言是编译为机器码
    sxfscool
        6
    sxfscool  
       2021-08-28 23:43:29 +08:00
    无暂停时间的 gc 是指 erlang 的么
    Cbdy
        7
    Cbdy  
    OP
       2021-08-29 10:41:11 +08:00 via Android
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1269 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:52 · PVG 01:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.