目录
1.面向对象
Java是一种完全面向对象的编程语言。面向对象编程的核心是把问题分解成对象,并定义这些对象的属性和方法。Java中的每个对象都是独立的实体,具有自己的状态和行为。Java语言提供了类、接口和继承等原语(原语是由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断),它对对象中的类、对象、继承、封装、多态、接口、包等均有很好的支持。为了简单起见,Java 只支持类之间的单继承,但是可以使用接口来实现多继承,并支持类与接口之间的实现机制(关键字为implements)。使用 Java 语言开发程序,需要采用面向对象的思想设计程序和编写代码。
2.平台无关性(平台独立性)(跨平台)(可移植性)
平台无关性是 Java 语言最大的优势。其它语言编写的程序面临的一个主要问题是操作系统的变化,处理器升级以及核心系统资源的变化,都可能导致程序出现错误或无法运行,而Java的虚拟机成功地解决了这个问题。Java的平台无关性具体表现在于,Java 是“一次编写,到处运行(Write Once,Run any Where)”的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。
Java 语言使用 Java 虚拟机机制屏蔽了具体平台的相关信息,使得 Java 语言编译的程序只需生成虚拟机上的目标代码(Java程序在编译时由Java编译器编译成为字节码文件(.class),JVM中的Java解释器会将.class文件翻译成所在平台上的机器码文件,再执行对应的机器码文件即可,这使得Java程序可以在任何平台上运行,实现了平台独立性。),就可以在多种平台上不加修改地运行。
引言:三种类型语言汇总
区分
Java的跨平台可以等同于可移植性,但如C/C++的编译性语言具有可移植性而其可执行程序不能跨平台。
- 编译型语言(如,C/C++),它的代码可以直接编译成机器码,从而提高程序的运行速度
- 半解释半编译语言(如,Java),其必须先将所有源代码编译为字节码的中间文件,然后依赖Java虚拟机才可以执行。这样Java就具有编译性语言和解释性语言的特点
一、跨平台(跨平台指的像Java编写的任何代码,无序修改即可在任何一个平台上运行)( **平台(Platform)**指的是操作系统和cpu的整体):
① 编译性语言(如C/C++)的可执行程序在不同的计算机硬件(x86平台、arm、AMD)、不同的操作系统(Linux\mac\windows etc.)甚至相同操作系统的不同版本之间不一定兼容。这主要是由于不同操作系统对可执行文件的内部结构有不同的要求,必须针对特定的目标平台编译出特定要求的可执行程序(也就是说,同样的源文件,经过不同的计算机硬件和不同的操作系统上的编译器编译后,生成了不同的机器码,是互不通用的。故无法实现跨平台。)。
例如C++的可执行程序在windows上是.exe文件,在Linux系统上是没有后缀的二进制文件,彼此之间也不能兼容。
①
GCC也是一个软件,是GNU Compiler Collection的缩写,指的是GNU编译器集合,应该和操作系统一样存放在电脑硬盘中。用于编译C、C++、Objective-C、Fortran、Ada、以及其他语言的代码。GCC是一种能够将高级编程语言转换为计算机系统可以理解的二进制形式的编译器。
② 而Java源码(.java)经过编译后,生成了class字节码文件,通过不同平台上的JVM(Java 虚拟机)都可以解释执行。JVM掩盖了计算机硬件和操作系统的差异,对class提供了统一的执行接口,这就是java为什么能跨平台的原因。
②
Java 程序执行流程图如下:
Java编译器在JDK的Java工具中(javac),使用javac将源码转换为.class文件,然后在JRE中运行.class文件,再通过JVM将字节码文件(扩展名为.class的文件)解释成具体系统平台的机器指令。【在JRE上运行字节码->在JVM上解释这些字节码】
以上参考:JDK、JRE、JVM 之间的关系(原文如下)
https://blog.csdn.net/m0_56673710/article/details/126093658
二、可移植性:
① 我们知道,编译过程,是将一门高级语言转化为目标机器语言,而中间需要编译器的介入。实际上,不同的机器使用的机器语言是不同的,所以使用的编译器也是不同的,高级语言的通用特性,就是高级语言可以通过不同的编译器转换成不同的机器语言。即,由于不同的硬件平台或操作系统其提供的函数库一般是不同的,所以同一份代码调用的API可能只是针对特定平台,若想使源代码跨平台编译,在不同的平台上需要使用不同的API库,甚至使用不同的编译器才能编译。(如,我们可以在编译时,使用不同编译器来将C源码转换成不同架构处理器的汇编。也就是说,如果程序在ARM处理器上运行,那就使用ARM的编译器 arm-gcc;如果程序在x86处理器上运行,那就使用 x86的编译器 gcc来编译,如:下面的示例图。即, C 语言程序则可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的 C 语言编译器和库,然后将 C 源代码编译、连接成目标二进制文件之后即可运行(#))。虽然最终的编译结果不同,但源代码是相同的,运行结果也是相同的,所以高级语言的源代码基本都具有代码可移植性。#在这里,我们所讲的 C 标准,当然可以通过不同的编译器编译后在任何一台平台上运行(就是可移植性),但是 C 标准除了文件操作之外,是没有涉及到操作系统硬件资源的接口的,比如进程调度,网络通信等 ,这些接口均为每一个操作系统独有的,windows与 Linux 这些接口有差异。一旦你的 C 程序中使用了这些接口,代码放到另外一个平台就无法编译通过了。
示例图:
② 而Java由于其有解释性语言的特点,故可实现跨平台,即-无序修改即可在任何一个平台上运行,故也具有代码可移植性。
注意
这里的平台指的大多为操作系统及CPU,而非IDE。IDE只是一个集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。有以下作用和优势:
且IDE本身跟硬件没有关系,是自带的编译器跟硬件平台有关。编译器与你是什么架构的CPU是相关的,不同架构的CPU,其机器指令不一样,所以需要不同的编译器
扩展
1.机器码不可移植的原因
机器码(二进制)是处理器能直接识别的语言,不同的机器码代表不同的运算指令,处理器可以识别哪些机器码是由处理器的硬件设备决定的,不同的处理器机器码可能不同。
比如在ARM处理器上加法可能用1100来表示,但在x86处理器上加法可能用0101来表示,这就决定了机器码不可被移植。
2.汇编不可移植的原因
汇编语言是机器码的符号化,即汇编就是用一个符号来代替一条机器码,这个是由编译器决定的,在ARM处理器上使用 ADD R1,#1 来表示加法运算,在x86处理器上使用 ADDL R1,#1 来表示加法运算。因此,汇编语言也不可移植。
3. 简单性(包含自动内存管理)
Java 语言的语法与 C 语言和 C++ 语言很相近,使得很多程序员学起来很容易。对 Java 来说,它舍弃了很多 C++ 中难以理解的特性,如操作符的重载和多继承等,而且 Java 语言不使用指针,加入了垃圾回收机制(即,自动内存管理:程序员不需要手动管理内存。Java虚拟机会自动对内存进行管理,包括分配、释放和回收等操作。这种机制可以减少程序员的工作量,同时也可以避免一些常见的内存管理错误),解决了程序员需要管理内存的问题,使编程变得更加简单。
4.解释执行
Java 程序在 Java 平台运行时会被编译成字节码文件,然后可以在有 Java 环境的操作系统上运行。在运行文件时,Java 的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运行环境中。
(我们知道C、C++等语言,都是只能对特定的CPU芯片进行编译,生成机器代码,该代码的运行就和特定的CUP有关。
同一个程序,如果是解释执行的,那么它的运行速度通常比编译为可执行的机器代码的运行速度慢一些。但是,对Java来说,二者的差别不太大,Java的字节码经过仔细设计,很容易便能使用JIT 即时编译方式 编译技术将字节码直接转化成高性能的本地机器码,Sun 公司在Java2发行版中提供了这样一个字节码编译器——JIT(Just In Time),它是Java虚拟机的一部分。【JIT技术是JVM中最重要的核心模块之一】)
5.多线程
Java 语言是多线程的,这也是 Java 语言的一大特性,它必须由 Thread 类和它的子类来创建。Java 支持多个线程同时执行,并提供多线程之间的同步机制。任何一个线程都有自己的 run() 方法,要执行的方法就写在 run() 方法体内。实际上多线程使人产生多个任务在同时执行的错觉,因为,目前的计算机的处理器在同一时刻只能执行一个线程,但处理器可以在不同的线程之间快速地切换,由于处理器速度非常快,远远超过了人接收信息的速度,所以给人的感觉好象多个任务在同时执行。C++没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序的设计。
6.分布式
Java 语言支持 Internet 应用的开发,在 Java 的基本应用编程接口中就有一个网络应用编程接口,它提供了网络应用编程的类库,包括 URL、URLConnection、Socket 等。Java 的 RIM 机制也是开发分布式应用的重要手段。
7.健壮性(包含自动内存管理)
Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的一大进步。另外,Java 的异常机制也是健壮性的一大体现。(如:自动内存管理,Java具有自动内存管理机制,程序员不需要手动管理内存。Java虚拟机会自动对内存进行管理,包括分配、释放和回收等操作。这种机制可以减少程序员的工作量,同时也可以避免一些常见的内存管理错误)
8.高性能
Java 的高性能主要是相对其他高级脚本语言来说的,随着 JIT(Just in Time)的发展,Java 的运行速度也越来越高。【JIT技术是JVM中最重要的核心模块之一】
9.安全性
① Java具有很高的安全性。Java代码运行在虚拟机中,不与操作系统直接交互。Java虚拟机通过安全管理器来保证Java程序的安全性,控制程序的访问权限,防止恶意代码对系统造成危害。
② Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防止恶意代码的攻击。除了 Java 语言具有许多的安全特性以外,Java 还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以防替代本地的同名类,并包含安全管理机制。
③ Java语言安全可靠,例如,Java的存储分配模型可以防御恶意代码攻击。此外,Java没有指针,因此外界不能通过伪造指针指向存储器。更重要的是,Java编译器在编译程序时,不显示存储安排决策,程序员不能通过查看声明猜测出类的实际存储安排。Java程序中的存储是在运行时由Java解释程序决定的。
④ ( 当你准备从网络上下载一个程序时,你最大的担心是程序中含有恶意的代码,比如试图读取或删除本地机上的一些重要文件,甚至该程序是一个病毒程序等。
当你使用支持Java的浏览器时,你可以放心地运行Java的小应用程序 Java Applet ,不必担心病毒的感染和恶意的企图,Java小应用程序将限制在 Java运行环境中,不允许它访问计算机的其它部分。)
10.动态性
Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。并且Java通过接口来支持多重继承,使之比严格的类继承具有更灵活的方式和扩展性。