- 简单性、面向对象、可移植(平台无关)、安全、健壮性、编译&解释、高性能、多线程、动态。
1、简单性(Simplicity)
- 上世纪九十年代,James Gosling 和团队希望构建一个无需深奥训练,就可以进行编程的系统。
- 在设计 Java 时,以便系统更容易理解,就让 Java 的语法尽可能的接近 C++ 。
- Java 的语法算是 C++ 语法的一个“纯净”版本。
- 如:没有头文件、指针、结构、联合、操作符重载、多重继承、手动管理内存等。
- 实现机制:
- 去复杂化:移除显式指针操作(由 JVM 管理内存)、头文件、预处理器等。
- 自动内存管理:垃圾回收机制(GC)代替手动内存释放。
- 清晰的语法结构:强制面向对象设计,统一使用类和方法组织代码。
2、面向对象(Object-Oriented)
3、分布式
- 特点:内置网络编程能力,适合分布式系统开发。
- 实现机制:
- RMI(远程方法调用):允许跨 JVM 调用对象方法。
- HTTP/HTTPS 客户端:Java 11+ 提供标准化的 HttpClient。
- 序列化:通过 Serializable 接口实现对象网络传输。
4、健壮性(Robustness)
- 特点:减少运行时错误,增强程序稳定性。
- 实现机制:
- 强类型检查:编译时严格类型匹配,避免隐式类型转换错误。
- 异常处理机制:强制处理检查异常(Checked Exceptions)。
- 如:IOException。
- 指针隐藏:通过引用替代显式指针,防止内存越界访问。
5、安全性
- 特点:防止恶意代码攻击,保障系统安全。
- 实现机制:
- 字节码验证:JVM 加载类时检查字节码合法性。
- 类加载隔离:双亲委派模型(Parent Delegation Model)确保核心类库不被篡改。
- 安全管理器:通过 SecurityManager 限制代码访问文件、网络等系统资源。
6、体系结构中立
- Java 编译器通过生成与特定计算机体系结构无关的 字节码指令 来实现这一特性。
- 精心设计的字节码不仅可以很容易地在任何机器上解释执行。
- 而且可以很容易地动态转换为原生的 机器代码。
7、可移植性
8、解释性
- Java 解释器可以在任何安装了解释器的机器上直接执行 Java 字节码。
9、高性能
- 特点:接近原生语言(C / C++)的执行效率。
- 早期的 Java 确实是解释性的。现在 Java 虚拟机使用了 即时编译器(JIT)。
- 因此,用 Java 编写的“热点”代码运行速度与 C++ 相差无几,有些情况下甚至更快。
- 实现机制:
- JIT 编译器:将热点代码(频繁执行的字节码)编译为本地机器码。
- 内存优化:堆外内存(如:ByteBuffer)和逃逸分析减少 GC 压力。
- 并发优化:无锁算法(如:CAS)和高效线程池提升吞吐量。
10、多线程与并发支持
- 因为,摩尔定律即将走到尽头。
- 我们不再追求更快的处理器,而是着眼于获得更多的处理器,而且要让它们保持繁忙。
- 特点:内置线程管理,支持多线程、高并发****编程。使多线程编程,变得简单。
- 实现机制:
- 线程模型:
- 通过 Thread 类、Runnable 接口或 Executor 框架创建线程。
- 同步机制:
- synchronized 关键字、Lock 接口。
- volatile 变量和原子类(如:AtomicInteger)。
- 并发工具包:
- java.util.concurrent 提供线程池。
- 并发集合(如:ConcurrentHashMap)和同步器(如:CountDownLatch)。
- 与 C++ 对比:
- C++11 之前:必须依赖操作系统 API 或第三方库(如:Boost.Thread、pthread)。
- C++11 及之后:标准库(thread、mutex 等)已支持多线程编程,无需第三方库。
- 高级需求:如果需要线程池、并行算法或更复杂的工具链,可借助第三方库。
- 如:Intel TBB、OpenMP 。
- 现代 C++ 开发中,标准库已足够覆盖大多数多线程场景,但第三方库能进一步提升开发效率和性能
11、动态性(Dynamic)
- 特点:支持运行时动态加载类、反射和代码扩展。
- 实现机制:
- 反射(Reflection):通过 Class 对象动态获取类信息、调用方法或修改字段。
- 如:Class.forName()。
- 动态代理:
- java.lang.reflect.Proxy生成接口的代理实例,支持 AOP(面向切面编程)。
- 动态类加载:自定义类加载器(如:ClassLoader)实现热部署和模块化加载。