Java语言环境白皮书 - 为你讲解Java设计者心中Java的

2018-12-28  本文已影响0人  静筱

引自:https://www.oracle.com/technetwork/java/index-136113.html

Java设计理念1:Simple and Farmiliar

【Java语言特性】

【与C/C++不同】

C/C++中被摒弃的特性

Java设计理念2:Object Oriented

Object Oriented并不是包治百病的神药。
它只是解决了Procedure Oriented不能解决的一些问题。

编程语言必须至少具有如下4个特征,才能称为是面向对象的

如何理解对象?
对象是对现实世界中事物的特征和行为的一种抽象和建模。
一切东西都可以抽象成一个对象,以及该对象的属性和行为。
人有高矮胖瘦等属性,也有走、停、工作、休息等等行为。

对象的基本概念

level 作用域
public any objects
protected 子类
private within this class
friendly(不指定时默认) 当前package

Java设计理念3:Architecture Neutral, Portable and Robust

分布式计算背景下要求软件可以无缝迁移到各种软硬件系统上。而且不能靠引入支持各种系统的二进制包的方式,来解决这个问题。另外分布式系统里的各个结点都要保证高可靠性。

image.png

Java没有采用C/C++不严格的编译器检查,而是在编译期做了非常严格充分的语义检查。所以可以提前发现原本只能在运行期发现的程序问题。

而且Java与C/C++最大的不同是Java使用真正的数组和字符串,而非指针,也就是说解释器可以检查数组和字符串的索引。避免内存改写或者是内存冲突。

Java设计理念4:Interpreted and Dynamic

Java类在需要的时候才会被加载,而且可以加载从网络上下载的类。所以大大提高了动态扩展性。

另外C++在程序运行之前,有一些对象己经在分配了内存。而Java中只有在运行时,才会实际分配对象的内存。一定程序上减少了C++的Fragile Base Class问题。

Java设计理念5:Secure

Java compiler和java runtime设计了对于错误代码设计了很多层防范措施,也就是所谓java的安全模型(secure model)。

java运行过程中需要用到的类文件,这些文件可能来自于本地文件系统或者是网络中。
加载这些文件时,首先会由字节码校验器(bytecode verifier)来检查这些被引用的类是否是安全的。然后再由字节码加载器(bytecode loader)来进一步检查。

java字节码运行一个线程所需要的环境,会被抽象成一系列的类,这些类按照来源不同,被拆分成多个命名空间。本地文件系统的类放一个命名空间,来源于网络的在另一个命名空间。

即使java代码本身遵守了java的规则,但是它引入的外部代码,不会被java compiler信任。而是会把它交给bytecode verificationfuc校验该代码是否格式正确,保证它遵守基本的规则:
(1). 没有伪造指针
(2). 没有违反访问权限控制
(3). 它引用的对象,都被正确使用

image.png

java network包支持多种网络协议以及网络访问控制:

Java设计理念6:Multithreading

Java提供一个Thread类,封装了线程的创建、执行、停止等行为控制。

Java的线程同步机制是基于传统的监控和条件变量方式。

线程的具体执行方式取决于java解析器(interpreter)运行的平台,有些支持时间分片的系统上,线程是采用时间分片的方式运行的(不考虑线程的优先级,每个线程都运行一定时间 额度)。
在不支持时间分片的系统上,线程还是按照优先级来调度执行。对于这种情况,计算密集的线程需要考虑定时yield(),来给其他线程运行的机会。

Java通过支持定义Thread对象以及在运行时支持多线程运行,实现了从语法层面支持多线程。在语言层面 ,被定义为synchronized的成员函数不会被并发执行。这类的函数通过monitors的控制,来保证其中定义的变量不会出现不一致的情况。 每一个类和实例化的变量都会被分配自己的monitor。

Java通过分配及释放monitor的方式,保证同一时刻,被标成synchronized的方法中只有一个会被执行。

Best Practise: 保持一个对象是线程安全的,需要在可能修改它的实例变量的所有方法上加注synchronized

Java中的monitor是re-entrant(允许重复获取),即使一个线程己经拥有一个monitor, 如果它需要的话,它还需要获得重复这个monitor。 避免了因为己经占有monitor,而导致的死锁。

Java对于多线程的支持是语法层面的,使得程序员更容易开发出线程安全的多线程程序。

【Java设计理念7:High Performance】
本章解答两个问题,其一,java语言的性能如何? 其二, 与其他语言相比,java的性能怎么样?

其性能能够符合大多数程序的需求。

对于其他高性能程序来说,可以在Java运行的机器上,通过just in time compiler(瞬时编译机制)来快速翻译成机器码,进行运行。对于常规的由编译器和动态加载器组成的java环境来说,JIT compiler就像在动态加载器里的机器码生成器, 即在动态加载时,把字节码直接编译成机器码。

由字节码转换出的机器码,性能大致与C和C++相同。

动态语言比如TCL, Lisp或者SmallTalk因为开发出的程序非常健壮(不必担心破坏内存),经常被用来构建原型。

相类似的,Java也非常适合用来构建原型,原因有两点:

  1. Java也因为其垃圾回收机制, 使得程序员不需要考虑太多内存的分配与回收的细节。

  2. 不同于TCL/Lisp/SmallTalk提供了丰富的语义,使得你不需要太早做决定?(TBD), Java要求你必须做明确的决定,在编译期,会检查所有的方法调用是否正确。也就是说你在运行期,不用担心方法调用失败。

Java设计理念8:Java系统package

Java系统包含很多工具类以方便程序员来开发适合不同平台的应用程序。
主要的包包括:
[1]. 基础包 - java.lang
[2]. 工具包 - java.util
[3]. 抽象窗口工具包 - java.awt

上一篇 下一篇

猜你喜欢

热点阅读