
1.4 Java语言的特性
Java从一开始就被设计成一种可移植、安全、简单的编程语言,它能一直受到大家的欢迎说明它是一门非常优秀的编程语言。那么它具备哪些优秀的特性呢?如图 1.4 所示,下面我们将列出Java语言的十大特性,并且对每个特性一一进行讲解。

图1.4 Java语言特性
● 上手简单。对于新手来说,学习 Java 是一件相对容易的事,因为它的语法非常简单明了,而且它是一门纯面向对象的编程语言,而面向对象的思考方式与现实世界十分贴合。此外,从某种意义上来说,Java是由C/C++演变而来的,它吸收了 C++的优点并改进了一些不足的地方,比如摒弃了指针这个复杂且易出错的概念,而且提供了垃圾回收机制,大大地简化了内存的管理工作。最后,Java创造了繁荣的技术生态,除了官方提供了丰富的类库,大量的第三方开发工具包和开源项目也不断地加入整个生态中。
● 跨平台。Java的跨平台主要表现在它的可移植性,即只要是Java程序(字节码)就可以运行在任意操作系统上,包括Windows、Linux、macOS和Solaris等操作系统,只需要它们安装Java虚拟机。我们知道C/C++语言会将代码编译成与硬件或操作系统相关的指令,这样就无法做到跨平台,而Java却能实现“编写一次,到处运行”的跨平台效果。要实现跨平台就要为每种操作系统都开发一个Java虚拟机,比如Windows版JVM、Linux版JVM、macOS版JVM,这些JVM用C/C++或汇编语言编写。
● 面向对象。面向对象是Java语言的基础特征,在Java世界中一切皆为对象。不同于函数编程,面向对象是将万物抽象成类,并在类内部定义相关属性和方法。相关的概念包括类、对象、属性、方法、封装、继承、多态和抽象等。

● 动态性。Java 的动态性主要体现在三个方面:一是支持动态地加载类,我们可以根据需要在运行过程中的任意时刻对类进行加载;二是支持动态地调整类的方法和属性,可以在运行时修改类结构;三是支持动态编译类,在运行过程中能对某段Java源码进行编译并运行。
● 安全性。Java语言本身具备很高的安全性,它摒弃了C/C++中指针的概念,从而能有效避免非法的内存操作。使用Java开发的应用能有效防止病毒和非法操作,这得益于Java程序运行在Java虚拟机沙箱内,内部的安全管理器会提供默认的策略来保护系统,所有未经允许的有害系统的行为都将会被禁止。
● 分布式。之所以说Java具有分布式特性,是因为通过它能很方便地开发分布式应用,比如Java提供的远程方法调用(Remote Method Invocation,RMI)和企业级Java Bean(Enterprise Java Bean,EJB),通过它们可以实现跨网络的方法调用,而代码看起来就像和本地调用一样。RMI和EJB现在很少使用了,因为有很多新的远程方法调用框架能更好地实现分布式应用。
● 多线程。Java从语言级上提供了多线程机制,使得我们能并行执行多项任务。Java提供的多线程能很好地解决各种并发问题,而且提供了同步机制和并发组件。
● 编译&解释。Java是一种编译和解释混合的语言,我们不能简单将其归类到编译型语言或解释型语言。Java源码会先被编译成字节码(后缀为.class的文件),然后JVM来解释这些字节码指令并开始执行,甚至在执行过程中还可能会将频繁执行的指令继续编译成底层的机器指令。
● 高性能。Java具有非常高的执行性能,它比其他任何解释型语言的执行速度都快。虽然整体上Java的性能仍然比不上C/C++(纯编译型语言),但随着Java的性能不断地被优化,它的执行速度已经非常接近C/C++了。
● 健壮性。Java语言具有很强的健壮性,内存的管理交由JVM使得Java程序不容易出现内存泄漏而导致崩溃,以及Java将易出错的指针屏蔽掉同样减少了程序崩溃的可能性。在语言层面,Java提供了异常捕获机制,能在程序运行中处理各种异常和错误,提升了程序的健壮性。
考考你
● Java语言的十大特性是什么?
● Java是如何做到跨平台的呢?
● Java的动态性主要表现在哪三个方面?
● Java的执行速度是否比C/C++还快?