Java语言具有哪些特点?

  Java语言是一门优秀的编程语言,它之所以应用广泛,受到大众的欢迎。是因为它有众多突出的特点,其中最主要的特点有以下几个。

  1.简单性

  Java语言是一种相对简单的编程语言,它通过提供最基本的方法完成指定的任务。程序员只需理解一些基本的概念,就可以用它编写出适用于各种情况的应用程序。Java摒弃了C++中很难理解的运算符重载、多重继承等概念;特别是Java语言使用引用代替指针,并提供了自动的垃圾回收机制,解决了程序员需要管理内存的问题。

  2.面向对象

  Java语言提供了类、接口和继承等原语,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯粹的面向对象的程序设计语言。

  面向对象是当今主流的程序设计思想,Java是一种完全面向对象编程的语言,因此必须熟悉面向对象才能够编写Java程序。面向对象的程序其核心是由类和对象组成,通过类和对象描述现实事物之间的联系。这种面向对象的方法更有利于人们对复杂程序的理解、分析、设计、编写和维护。

  3.安全性

  Java语言安全可靠,例如,Java的存储分配模型可以防御恶意代码攻击。此外,Java没有指针,因此外界不能通过伪造指针指向存储器。更重要的是,Java编译器在编译程序时,不显示存储安排决策,程序员不能通过查看声明猜测出类的实际存储安排。Java程序中的存储是在运行时由Java解释程序决定的。

  4.跨平台性

  Java语言通过JVM(Java Virtual Machine,Java虚拟机)和字节码实现跨平台。Java程序由Java编译器编译成为字节码文件(.class),JVM中的Java解释器会将.class文件翻译成所在平台上的机器码文件,再执行对应的机器码文件即可。Java程序只要“一次编写,就可到处运行”。

  5.支持多线程

  Java语言支持多线程。多线程可以简单理解为程序中多个任务可以并发执行,从而显著提高程序的执行效率。

  6.分布性

  Java是分布式语言,既支持各种层次的网络连接,又可以通过Socket类支持可靠的流(Stream)网络连接。用户可以产生分布式的客户机和服务器,在这个过程中,网络变成软件应用的分布式运载工具。

Java 16 的主要特性

Java 16 添加了许多 孵化模块(ncubator module),大多是第一个迭代版本, 这些模块很多已经在后续的版本中被修改了,了解下就好,不要在生产环境中使用。

引入一套 API 允许 Java 程序安全和高效的访问外部内存,可替代 sun.misc.Unsafe 。 增加了一个孵化模块,名叫 jdk.incubator.foreign,有三个主要的抽象概念:

  • MemorySegment 作为一段连续内存的模型
  • MemoryAddress 作为地址模型,可以表示堆内存或堆外内存
  • MemoryLayout 是对内存片段的编程式描述

下面是简单的代码示例:

在后面的版本中,这套 API 又进行了更新,上面的代码只能在 Java 版本中运行。

引入一个提供静态类型的纯 Java 访问本地代码的 API,结合上面的外部内存访问 API 将大大简化绑定到本机库的其他容易出错的过程。

Java 在之前的版本中已经提供 JNI 方案来实现本地调用,但是使用麻烦,也很弱。JNI 要求开发 Java API,c 语言头文件,c 语言实现,即使有工具辅助,开发者也不得不通过多个工具链保持多平台的同步。于是,又出现了许多框架来填补这片空白,像 JNA、JNR、JavaCPP 等。Foreign Linker API 则可以将外部本地函数暴露为 method handle,使其可以直接使用 Java 代码调用,不需要像 JNI 一样编写胶水代码。

假设我们想要调用下面的标准库函数:

通过 CLinker 和 LibraryLookup 相关的 API 可以获取到 MethodHandle 对象。

除了 Downcalls 还有 Upcalls,可以将 Java 代码作为函数指针传递给外部本地函数,这里就不再多做介绍了。

Java 调用本地代码,我基本上从来没有在工作中使用过,一般普通的调用,可以使用 Java 的 command 调用。 一般的开发,这样的需求比较少,只有一些需要和底层紧密结合的程序才用的到,像 JavaFX 实现就需要编写 c 和 c++ 代码来调用底层的图形库。

将所有 JDK 内部元素做了强封装,将程序对内部 api 的访问做了限制,已经存在的代码如果使用了内部的类、方法或字段,可能会无法运行,通过参数 –illegal-access=permit ,这个参数未来也会删除。

下面列出了部分示例代码,都是无法继续使用的,运行时会报异常:

将原始类型的包装类标记为 value-based,弃用它们的构造器,并给予弃用警告。对于 java 平台中任何使用基于值(value-based)的类实现不正当的同步行为给予警告。

早在 Java 9 已经将包装类的构造器标记为弃用并在未来删除,由于原始类型是有缓存机制,构造出来的实例并不是 唯一(值相同有可能是同一个实例),用于同步是不可靠的。

在 java.nio.channels, SocketChannel, and ServerSocketChannel 中提供对 Unix domain sockets (AF_UNIX)的支持。

日期格式新增字母 B 表示一天中的时间段(day period),在类 java.time.format.DateTimeFormatter/DateTimeFormatterBuilder 中提供了支持。

toList() 方法相比之前使用 collect() 方便了很多。但是,也有可能造成源码不兼容的情况,比如说你写一个类来实现 Stream, 那么在这个类中就不能从别的地方静态引入 toList(),因为 toList() 会被认为是调用类自己的方法, 如果要使用 Collectors.toList() 只能使用全限定名。

增加一个孵化模块 jdk.incubator.vector,提供向量运算 API,在运行时编译为适当的硬件指令,提升运算速度。

CompileCommand 参数有个 option 类型用于传递子命令集合,这些命令没有合法性检查,以致于如果有拼写错误命令会被忽略。现在的格式是:

现在所有的选项命令都作为普通命令按下面的格式传递:

示例:

ZGC 现在可以并发进行线程栈处理了,所有的 JVM 中的 gc root 对象都会在 ZGC 的并发阶段被处理,取代之前的 stop-the-world 停顿。

jdk.ObjectAllocationSample 事件的引入允许始终在线和低开销的分配信息收集。

及时的将 HotSpot 中无用的元数据(metaspace)内存还给操作系统,减少元数据的内存占用。

jarsigner 是一个用于 jar 文件签名和校验的工具,新版本的 jarsigner 在签名后生成的新文件将 保留 POSIX 文件权限和链接属性。

密封类(Sealed Classes)从 jdk15 开始添加了第一个预览版本,16 更新了第二个预览版本,在 17 中成为正式版本。 密封类的主要用途是对一个类或接口增加约束,可以限制哪些类才能继承或实现类和接口。

放宽了嵌入限制,支持了方法、成员变量等在内部类中申明。

构造函数:

方法:

局部申明,嵌入使用:

我倒是觉得 record 再扩展下去没有必要,也不怎么实用,反正我很少去用。

引进新语法支持在使用 instanceof 判定类型和同时申明一个转换好类型的变量。

还可以很方便的写一些逻辑运算:

打包工具 jpackage 在 14 版本中被引入,在 15 中依然是孵化中的状态,在 16 中已经可以投入生产了。

工具支持原生包格式能够给用户一个自然的安装体验,格式包括:windows 上的 msi 和 exe , macOS 上的 pkg 和 dmg , linux 上的 deb 和 rpm 。 可以直接在命令行调用或者通过编码的方式,通过 ToolProvider 来使用。

部分使用示例:

  • 删除 java.awt.PeerFixer
  • 删除实验性质的 AOT 和 Graal JIT,JIT 编译器 Graal 无法再使用
  • SunEC provider 不再支持一些已经淘汰的椭圆曲线算法

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。