Java 学习笔记 | Java语言的特点

Java 语言的特点

  1. 简单性
  2. 面向对象
  3. 分布式

    Java 有一个丰富的例程库,用于处理像 HTTP 和 FTP 之类的 TCP/IP 协议。
    Java 应用程序能够通过 URL 打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。


    —— 摘自 Java Core(第11版中文版) 1.2.3 节

  4. 健壮性
  5. 安全性
  6. 体系结构中立

    编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有 Java 运行时系统,这些编译后的代码可以在许多处理器上运行。Java 编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且还可以动态地转换成本地机器代码。


    —— 摘自 Java Core(第11版中文版) 1.2.6 节

  7. 可移植性
  8. 解释型

    Java 解释器可以在任何移植了解释器的机器上直接执行 Java 字节码。由于连接是一个增量式且轻量级的过程,所以,开发过程也变得更加快捷,更加具有探索性。


    —— 摘自 Java Core(第11版中文版) 1.2.8 节

  9. 高性能
  10. 多线程
  11. 动态性

    从很多方面来看,Java 与 C 或 C++ 相比更加具有动态性。它能够适应不断发展的环境。库中可以自由地添加新方法和实例变量,而对客户端却没有任何影响。
    在 Java 中找出运行时类型信息十分简单。


    —— 摘自 Java Core(第11版中文版) 1.2.11 节

“分布式”是什么意思

在看到 1.2.3 节的时候看到了分布式这个概念。
虽然之前也确实听说过这个词,并且经常听说,但是,对于这个词,我并没有去深究过,并没有一个较为清晰的概念,于是,看到这里,想要仔细看下分布式这个概念的基本定义或者说基本理解。

  • Java Core 对分布式的解释

    Java 有一个丰富的例程库,用于处理像 HTTP 和 FTP 之类的 TCP/IP 协议。
    Java 应用程序能够通过 URL 打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。


    —— 摘自 Java Core(第11版中文版) 1.2.3 节

    看完书中的解释,似乎理解了一些,是说 Java 可以通过一些措施(不深究)去很简单地达到访问网络上或远端的一些对象的目的
    但是,这句话是我自己从书中的描述中提炼出来的,所以我还是非常迷糊,并且总感觉分布式不该是这么“浅显”的定义。

  • 百度百科上对分布式的解释

    分布式计算是计算机科学中一个研究方向,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果。分布式网络存储技术是将数据分散地存储于多台独立的机器设备上。


    —— 摘自 百度百科 | 分布式 (计算机的一种算法)

    在以上的描述中,提到了把一个“大”的问题拆解成很多“小”的部分,然后将这些“小”的部分分配给多个计算机进行处理,最后将结果汇总
    看到这个描述,我感觉似乎又清晰了一些,并且这个描述和我之前“隐约(或无意)”间听到的描述还是较为贴近的。

  • 几篇博客或文章中对“分布式”的描述

    分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据


    —— 摘自 什么是分布式系统,如何学习分布式系统

    分布式系统是若干独立计算机的集合,这计算机对用户来说就像单个相关系统。


    —— 间接摘自 到底什么是分布式系统? [原文: 分布式系统原理与范型]

    1.分布式系统一定是由多个节点组成的系统。
        其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。
    2.这些连通的节点上部署了我们的节点,并且相互的操作会有协同。


    什么是 JAVA 分布式应用?
    一个大型的系统往往被分为几个子系统来做,一个子系统可以部署在一台机器的多个 JVM 上,也可以部署在多台机器上。但是每一个系统不是独立的,不是完全独立的。需要相互通信,共同实现业务功能。


    一句话来说:分布式就是通过计算机网络将后端工作分布到多台主机上,多个主机一起协同完成工作。


    —— 摘自 JAVA 分布式 - 分布式介绍

将这几个博客(文章)中对分布式的描述看完之后,对“分布式”这个概念还是有了较为清楚的认识了。当然,比不上专业的,但是最浅显的认识还是学到了。
概括性的描述我也不写了,作为笔记,看一遍更加深印象,并且,如果有帮助到其他朋友,相信看完这几段描述后,自己也会有一个属于自己的认识。😁

Java 语言是编译型的还是解释型的

因为在 1.2.8 节看到解释型这个词,所以我第一时间有些迷惑。
之前看过很多文章,视频,包括一些书籍,都在说 Java 是编译型的语言,而像 JavaScript 这种是解释型的语言。可是,为什么 Java Core 上来第一章就告诉我 Java 是解释型的呢?
于是,我查了一些资料,找到了答案:

  1. 首先,Java Core 并没有 Java 是解释型的语言,是我自己没有理解正确。原文如下:

    Java 解释器可以在任何移植了解释器的机器上直接执行 Java 字节码。由于连接是一个增量式且轻量级的过程,所以,开发过程也变得更加快捷,更加具有探索性。


    —— 摘自 Java Core(第11版中文版) 1.2.8 节

    我特意将Java 解释器这几个字加粗了!Java 解释器(这里指的应该是JVM)将 Java 字节码逐行解释执行,所以,Java 解释器是解释型的。

  2. 现在用编译型、解释型来对编程语言进行分类已经不准确了。

    编译或解释不是语言的特性,而是实现的特性。所以说,问题是不存在的,你根本不能说一门语言是编译型的还是解释型的。只是有些语言偏向了某一种实现,但仍不能因此说它是解释性/编译型的。有趣的是,有相当多的语言与两种可用的实现,请参考Haskell和ML,官方同时它们同时提供了解释器和编译器,用户可以自由选择其中的一种。


    —— 摘自 https://www.zhihu.com/question/19608553/answer/370707189

  3. Java 兼具编译型语言和解释型语言的特点。

    编译型语言(compiled language) 指通过编译器(compiler)将源代码编译为机器码(machine code)后运行的语言,例如C、C++;
    解释型语言(interpreted language) 指由解释器(interpreter)直接执行,不需要编译成机器语言,例如 PHP、JavaScript。


    —— 摘自 https://www.zhihu.com/question/19608553/answer/1388597692(偷懒下,我并没有去找这两个定义的原出处)

  4. Java 的源代码首先被编译成字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码。

    —— 摘自 https://www.zhihu.com/question/19608553/answer/14700971

以上列出的这些点都没有具体,确切地列出来这个问题的答案,但是,如果有朋友看到这篇文章,并且看到了这里,相信心里已经有答案了。

关于 Java 兼具编译型语言和解释型语言的特点这一点,需要提到的一个东西是:JShell

JShell (REPL)

JShell 程序是 Java 9 引入的一个交互式的编程环境工具,提供了一个读取-计算-打印循环(REPLRead-Evaluate-Print-Loop)。

即时编译

Java 程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler,JIT 编译器)


—— 摘自 JVM即时编译(JIT)

  • 为了兼顾跨平台和运行速度,Java 源代码首先会被编译为字节码文件(.class),但并非是机器语言,而是需要在 JVM 上运行,而 .class 文件在 JVM 上是解释执行的。所以 Java 兼具编译型语言和解释型语言的特点。
  • 为了更高的效率,JVM 还引入了 JIT(just-in-time,即时编译)编译器,在 Java 程序运行时进一步编译,转换成高度优化的机器代码。


    —— 摘自 https://www.zhihu.com/question/19608553/answer/1388597692

JAVA的第一道工序是javac编译,当然目标文件是BYTECODE。后续可能有三种处理方式:

  1. 运行时,BYTECODE由JVM逐条解释执行
  2. 运行时,部分代码可能由JIT翻译为目标机器指令(以method为翻译单位,还会保存起来,第二次执行就不用翻译了)直接执行;
  3. RTSJ。继JAVAC之后执行AOT二次编译,生成静态的目标平台代码(典型的就是IBM WEBSHPERE REAL TIME)。
    有的时候,可能是以上三种方式同时在使用。至少,1和2是同时使用的,3需要程序员手工指定。


    —— 摘自 https://www.zhihu.com/question/19608553/answer/27896401

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十甫寸木南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值