Java(编程语言)

爪哇
范例 多范式通用面向对象基于类),功能命令反射性并发
设计 詹姆斯·高斯林(James Gosling)
开发人员 Oracle Corporation
首先出现 1995年5月23日
打字学科 静态,坚固,安全名义明显
内存管理 自动垃圾收集
文件名扩展 .java, .class.jar ,.jmod
网站
  • oracle.com/java/
  • java.com
  • Dev.Java
被影响
CluSimula67LispSmallTalkADA 83C ++C#EiffelMesa ,Mesa, Modula-3OberonObjective-CUCSD Pascal对象Pascal
受影响
ADA 2005BeanshellC#ChapelClojureEcmasimpriptFantomGambasGroovyHackHaxeJ#Kotlin ,Php, PythonPythonScala ,Seed7, Seed7 ,Vala, ValaJavascriptJS ++
  • Wikibooks的Java编程

Java是一种高级基于班级的面向对象的编程语言,旨在具有尽可能少的实现依赖性。这是一种通用编程语言,旨在让程序员写一次,在任何地方运行WORA ),这意味着编译的Java代码可以在支持Java的所有平台上运行,而无需重新编译。 Java应用程序通常被编译到可以在任何Java虚拟机(JVM)上运行的字节码,而不论基础计算机架构如何。 Java的语法类似于CC ++ ,但低级设施的功能少于任何一个。 Java运行时提供了动态功能(例如反射和运行时代码修改),这些功能通常在传统的编译语言中不可用。

Java发行后不久就广受欢迎,此后一直是一种非常受欢迎的编程语言。根据Github的说法,Java是2022年第三个最受欢迎的编程语言,截至2023年10月,它在Tiobe指数上排名第四。尽管仍然很受欢迎,但近年来Java使用JVM使用JVM的Java逐渐下降了Java受欢迎程度。

Java最初是由Sun MicrosystemsJames Gosling开发的。它于1995年5月作为Sun Microsystems Java平台的核心组成部分发布。原始和参考实施Java编译器,虚拟机和班级库最初是由Sun在专有许可下发布的。截至2007年5月,按照Java社区流程的规格,Sun已根据GPL-2.0的许可将其大多数Java技术遗憾Oracle提供了自己的热点Java虚拟机,但是官方的参考实现OpenJDK JVM,它是免费的开源软件,并由大多数开发人员使用,并且是几乎所有Linux发行版的默认JVM。

截至2023年9月, Java 21是最新版本,这也是长期支持(LTS)版本。 Java 8、11和17是以前的LTS版本仍得到正式支持。

历史

公爵,爪哇吉祥物
James Gosling ,Java的创建者,2008年
从2002年到2022年, TIOBE编程语言受欢迎程度指数图。Java从2015年中期到2020年初一直处于最高水平。

詹姆斯·高斯林(James Gosling),迈克·谢里丹(Mike Sheridan)和帕特里克·诺顿(Patrick Naughton)于1991年6月启动了Java语言项目。Java最初是为互动电视设计的,但对于当时的数字有线电视行业来说太高了。该语言最初被称为橡树,一棵橡树,站在高斯林(Gosling)的办公室外面。后来,该项目以格林(Green)的名字命名,最终从印度尼西亚的一种咖啡中更名为Java Coffee 。 Gosling使用C / C ++式语法设计Java,系统和应用程序程序员会发现熟悉的Java。

Sun Microsystems1996年发布了第一个公共实施方式。相当安全并且具有可配置的安全性,它允许网络和文件访问限制。主要的Web浏览器很快就结合了在网页中运行Java applets的能力,Java很快变得流行。 Java 1.0编译器在Java中Arthur Van Hoff重写,以严格遵守Java 1.0语言规范。随着Java 2的出现(最初于1998年12月至1999年以J2SE 1.2发行),新版本具有为不同类型的平台构建的多种配置。 J2EE包含用于企业应用程序的技术和API,通常在服务器环境中运行,而J2ME的API为移动应用程序进行了优化。桌面版本更名为J2SE。在2006年,出于营销目的,Sun分别将新的J2版更名为Java EEJava MEJava SE

1997年,Sun Microsystems与ISO/IEC JTC 1标准机构接触,后来又接触了ECMA International来正式化Java,但很快就退出了该过程。 Java仍然是通过Java社区流程控制的事实上的标准。有一次,尽管有专有的软件状态,Sun仍将其大部分Java实施提供了无需负责。 Sun通过出售Java Enterprise System等专业产品的许可证,从Java产生了收入。

2006年11月13日,Sun以仅GPL-2.0的许可证的条款发布了大部分Java虚拟机(JVM)作为免费和开源软件(FOSS)。 2007年5月8日,Sun完成了这一过程,使其所有JVM的核心代码都在免费软件/开源分发条款下可用,除了Sun没有版权的一小部分代码外。

Sun副总统Rich Green说,Sun在Java方面的理想角色是传教士。随着Oracle Corporation在2009 - 10年度对Sun Microsystems的收购,Oracle将自己描述为Java技术的管家,他们无情地承诺促进参与和透明度社区。这并不能阻止Oracle在此之后不久就针对Google提起诉讼,以在Android SDK内使用Java(请参阅Android部分)。

2010年4月2日,詹姆斯·高斯林(James Gosling)从甲骨文(Oracle)辞职。

2016年1月,Oracle宣布,基于JDK 9的Java运行时间环境将停止浏览器插件。

Java软件在从笔记本电脑到数据中心游戏机到科学超级计算机的所有内容都运行。

由于旧版本未解决的安全性问题, Oracle (和其他)强烈建议使用Java的过时和不支持的Java版本。

原则

创建Java语言有五个主要目标:

  1. 它必须简单,面向对象和熟悉。
  2. 它必须坚固且安全。
  3. 它必须是建筑 - 中性和便携式。
  4. 它必须高性能执行。
  5. 必须解释螺纹动态

版本

截至2023年9月,Java 8、11、17和21被支持为长期支持(LTS)版本。

Oracle于2019年1月发布了版本Java 8 LTS的最后一次零成本公共更新,以供商业使用,尽管否则它仍将支持Java 8,并无限期地支持公共更新。其他供应商已开始提供仍在获得安全性和其他升级的OpenJDK 18和8、11和17的零成本构建

Java的主要版本以及其发布日期:

版本 日期
JDK Beta 1995
JDK 1.0 1996年1月23日
JDK 1.1 1997年2月19日
J2SE 1.2 1998年12月8日
J2SE 1.3 2000年5月8日
J2SE 1.4 2002年2月6日
J2SE 5.0 2004年9月30日
Java SE 6 2006年12月11日
Java SE 7 2011年7月28日
Java SE 8(LTS) 2014年3月18日
Java SE 9 2017年9月21日
Java SE 10 2018年3月20日
Java SE 11(LTS) 2018年9月25日
Java SE 12 2019年3月19日
Java SE 13 2019年9月17日
Java SE 14 2020年3月17日
Java SE 15 2020年9月15日
Java SE 16 2021年3月16日
Java SE 17(LTS) 2021年9月14日
Java SE 18 2022年3月22日
Java SE 19 2022年9月20日
Java SE 20 2023年3月21日
Java SE 21(LTS) 2023年9月19日

版本

Sun已定义并支持针对不同应用程序环境的Java的四个版本,并将其许多API分割,以便它们属于其中一个平台。平台是:

Java API中的被组织成一个单独的组,称为软件包。每个软件包都包含一组相关的接口,类,子包和异常

Sun还提供了一个名为“个人Java”的版本,该版本已被后来的基于标准的Java ME配置配对所取代。

执行系统

Java JVM和字节码

Java的一个设计目标是可移植性,这意味着为Java平台编写的程序必须在与足够的运行时间支持的硬件和操作系统的任何组合上类似地运行。这是通过将Java语言代码编译到称为Java字节码的中间表示,而不是直接到特定于架构的机器代码来实现的。 Java字节码指令类似于机器代码,但旨在由专门为主机硬件编写的虚拟机(VM)执行。最终用户通常使用其设备上安装的Java运行时环境(JRE)进行独立的Java应用程序或用于Java小程序的Web浏览器。

标准库提供了一种通用方法,用于访问特定于主机的功能,例如图形,线程网络

通用字节码的使用使移植变得简单。但是,将字节码解释到机器指令中的开销使解释的程序几乎总是比本机可执行文件更慢。从早期阶段引入了将字节编码编译为机器代码的Qust -In-tim-time (JIT)编译器。 Java的热点编译器实际上是两个编译器。并使用graalvm (例如Java 11中,但在Java 16中被删除)允许分层编译。 Java本身是独立于平台的,并且适用于由Java Virtual Machine (JVM)上运行的特定平台,该平台将Java字节码转换为平台的机器语言。

表现

Java编写的程序的声誉较慢,并且需要比C ++写的更多记忆。但是,随着1997/1998的Java 1.1引入即时汇编,Java程序的执行速度大大提高。),以及Java虚拟机的优化,例如Hotspot在2000年成为Sun的默认JVM。随着Java 1.5,加上添加的性能得到了提高java.util.concurrent软件包,包括无锁的ConsurrentMaps和其他多核收集的软件包,并使用Java 1.6进一步改进了该软件包。

非JVM

一些平台为Java提供了直接的硬件支持;有一些微控制器可以在硬件中运行Java字节码,而不是软件Java虚拟机,并且某些基于ARM的处理器可以通过其Jazelle选项执行Java字节码来支持硬件支持,尽管支持当前ARM实现的支持大部分。

自动内存管理

Java使用自动垃圾收集器来管理对像生命周期中的内存。程序员确定何时创建对象,并且Java运行时负责恢复对像一旦使用对象。一旦不存在对对象的引用,垃圾收集器就有资格自动释放了无法实现的内存。如果程序员的代码保存不再需要的对象,通常是当不再需要的对象存储在仍在使用的容器中时,可能仍会发生类似于内存泄漏的事情。如果调用了不存在的对象的方法,则会抛出空指针异常。

Java自动内存管理模型背后的想法之一是,可以使程序员承担执行手动内存管理的负担。在某些语言中,用于创建对象的内存被隐式分配在堆栈上,或明确分配和从分配和划分。在后一种情况下,管理内存的责任与程序员有关。如果程序不处理对象,则会发生内存泄漏。如果该程序试图访问或交易已经被划分的内存,则结果是不确定且难以预测的,并且该程序可能会变得不稳定或崩溃。可以通过使用智能指针来部分修复这一点,但是这些增加了开销和复杂性。垃圾收集不会阻止逻辑内存泄漏,即仍然引用存储器但从未使用过的存储器。

垃圾收集可能随时发生。理想情况下,它将在程序闲置时发生。如果在堆上没有足够的自由内存来分配新对象,则可以触发它。这可能会导致程序暂时失速。 Java中不可能进行明确的内存管理。

Java不支持C/C ++样式指针算术,可以通过算术操纵对像地址(例如,添加或减去偏移)。这使垃圾收集器可以重新安置引用的对象并确保类型的安全性和安全性。

就像在C ++和其他一些面向对象的语言中一样,Java的原始数据类型的变量直接存储在字段(用于对象)或堆栈(用于方法)中,而不是在堆中,而不是在堆中,而非主要数据通常是正确的类型(但请参见逃生分析)。出于绩效原因,这是Java设计师的有意识的决定。

Java包含多种类型的垃圾收集器。自Java 9以来,Hotspot将垃圾首次垃圾收集器(G1GC)用作默认值。但是,还有其他几个垃圾收集器可用于管理堆。对于Java中的大多数应用,G1GC就足够了。以前,Java 8中使用了平行垃圾收集器

解决了内存管​​理问题后,不会使程序员负担正确处理其他类型的资源的负担,例如网络或数据库连接,文件处理等,尤其是在存在异常的情况下。

句法

Java核心类的依赖图(使用JDEP和GEPHI创建)

Java的语法在很大程度上受C ++C的影响。与C ++不同的是,结合了结构化,通用和面向对象的编程的语法,Java几乎完全是面向对象的语言。所有代码均在类中编写,每个数据项都是一个对象,除原始数据类型(即整数,浮点数,布尔值和字符)外,出于性能原因,这不是对象。 Java重复了C ++的一些流行方面(例如printf方法)。

与C ++不同,Java不支持运算符过载或类的多个继承,尽管对于接口支持了多个继承。

Java使用类似于C ++的评论。有三种不同的评论样式:一种单线样式,标有两个斜线(//),由多行样式打开/*并关闭*/,以及Javadoc的评论风格以/**并关闭*/。 Javadoc的评论方式使用户可以运行Javadoc可执行文件以为程序创建文档,并且可以通过某些集成的开发环境(IDE)(例如Eclipse )读取,以允许开发人员访问IDE中的文档。

你好世界示例

传统的Hello World节目可以用Java编写为:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Prints the string to the console.
    }
}

所有源文件必须以其包含的公共类命名,附加后缀.java, 例如,HelloWorldApp.java。必须首先使用Java编译器将其编译到字节码中,并与.class后缀 (Main.class, 在这种情况下)。只有这样,它才能执行或启动。 Java源文件可能只包含一个公共类,但是它可以包含具有非公开访问修饰符和任意数量的公共内部类的多个类。当源文件包含多个类时,有必要进行一个类(由class关键字)公开(之前public关键字)并用该公共类名称命名源文件。

未宣布公开的课程可以存储在任何.java文件。编译器将为源文件中定义的每个类生成一个类文件。类文件的名称是类的名称,并附有.class 。对于类文件的生成,匿名类被视为其名称是其封闭类, $和整数的名称的串联。

关键字public表示可以从其他类中的代码调用方法,或者可以由类层次结构以外的类使用类。类层次结构与.java文件所在的目录的名称有关。这称为访问级别修饰符。其他访问级修饰符包括关键字private(一种只能在同一类中访问的方法)和protected(这允许来自同一软件包的代码访问)。如果一块代码试图访问私人方法或受保护的方法,JVM将抛出SecurityException.

关键字static在方法的前面指示一种静态方法,该方法仅与该类相关,而与该类的任何特定实例相关联。只能不参考对象就可以调用静态方法。静态方法无法访问任何也不静态的类成员。未指定静态的方法是实例方法,需要类的特定实例才能操作。

关键字void指示主要方法不会向呼叫者返回任何值。如果Java程序要使用错误代码退出,则必须调用System.exit()明确。

方法名称main不是Java语言中的关键字。这只是Java Launcher调用将控件传递到程序的方法的名称。在托管环境中运行的Java类,例如Applet和Enterprise Javabeans不使用或需要main()方法。 Java程序可能包含多个具有main方法,这意味着需要明确告知VM从哪个课程开始。

主要方法必须接受String对象。按照惯例,它被称为args尽管可以使用任何其他法律标识符名称。由于Java 5以来,主要方法也可以使用变量参数,形式public static void main(String... args),允许使用任意数量的主要方法调用String争论。该替代声明的效果在语义上是相同的(与args参数仍然是String对象),但它允许替代语法来创建和传递数组。

Java Launcher通过加载给定类(在命令行或JAR中指定为属性)并开始其启动Java并启动其public static void main(String[])方法。独立程序必须明确声明此方法。这String[] args参数是String包含任何参数传递给类的对象。参数为main通常通过命令行通过。

打印是Java标准库的一部分:System课程定义了一个称为公共静态字段out。这out对像是PrintStream类并提供许多用于打印数据以标准的方法,包括println(String)这也将新的线附加到传递的字符串。

字符串"Hello World!"由编译器自动将其转换为字符串对象。

用方法的示例

// This is an example of a single line comment using two slashes

/*
 * This is an example of a multiple line comment using the slash and asterisk.
 * This type of comment can be used to hold a lot of information or deactivate
 * code, but it is very important to remember to close the comment.
 */

package fibsandlies;

import java.util.Map;
import java.util.HashMap;

/**
 * This is an example of a Javadoc comment; Javadoc can compile documentation
 * from this text. Javadoc comments must immediately precede the class, method,
 * or field being documented.
 * @author Wikipedia Volunteers
 */
public class FibCalculator extends Fibonacci implements Calculator {
    private static Map<Integer, Integer> memoized = new HashMap<>();

    /*
     * The main method written as follows is used by the JVM as a starting point
     * for the program.
     */
    public static void main(String[] args) {
        memoized.put(1, 1);
        memoized.put(2, 1);
        System.out.println(fibonacci(12)); // Get the 12th Fibonacci number and print to console
    }

    /**
     * An example of a method written in Java, wrapped in a class.
     * Given a non-negative number FIBINDEX, returns
     * the Nth Fibonacci number, where N equals FIBINDEX.
     * 
     * @param fibIndex The index of the Fibonacci number
     * @return the Fibonacci number
     */
    public static int fibonacci(int fibIndex) {
        if (memoized.containsKey(fibIndex)) {
            return memoized.get(fibIndex);
        }

        int answer = fibonacci(fibIndex - 1) + fibonacci(fibIndex - 2);
        memoized.put(fibIndex, answer);
        return answer;
    }
}

特殊课

小程序

Java小程序是嵌入在其他应用程序中的程序,通常是在Web浏览器中显示的网页中。自2017年Java 9以来,Java Applet API现在已弃用。

servlet

Java Servlet Technology为Web开发人员提供了一种简单,一致的机制,用于扩展Web服务器的功能并访问现有业务系统。 servlet是服务器端的Java EE组件,可生成对客户端请求的响应。在大多数情况下,这意味着根据HTTP请求生成HTML页面,尽管还有许多其他标准的Servlet类,例如用于WebSocket通信。

Java Servlet API在某种程度上已被两种用于Web服务的标准Java Technologies取代(但仍在引擎盖下):

这些API在应用程序服务器或servlet容器上的典型实现使用标准servlet来处理所有交互,并使用HTTP请求和响应将其委派给Web服务方法的实际业务逻辑。

Javaserver页面

Javaserver页面( JSP )是服务器端Java EE组件,它们为客户端HTTP请求生成响应(通常是HTML页面)。 JSP嵌入Java代码在HTML页面中使用特殊定义者<%%>。将JSP编译到Java Servlet ,这本身就是Java应用程序,第一次访问它。之后,生成的servlet创建了响应。

秋千应用

Swing是Java SE平台的图形用户界面。可以通过摇摆的外观和感觉系统来指定不同的外观和感觉。 WindowsGTK+图案的克隆由Sun提供。苹果还为macOS提供了水上的外观和感觉。如果这些外观和感觉可能被认为缺乏,Java SE 6中的摇摆通过使用基础平台的更多本机GUI窗口绘图例程来解决此问题。

Javafx应用程序

Javafx是一个用于创建和交付桌面应用程序的软件平台,以及可以在各种设备上运行的丰富Web应用程序。 Javafx旨在代替Swing作为Java SE的标准GUI库,但是由于JDK 11 JAVAFX不在核心JDK中,而是在单独的模块中。 Javafx在Microsoft WindowsLinuxMacOS上支持台式计算机Web浏览器。 Javafx不支持本机OS外观和感觉。

仿制药

2004年,作为J2SE 5.0的一部分,将仿制药添加到Java语言中。在引入仿制药之前,每个变量声明都必须具有特定类型。例如,对于容器类,这是一个问题,因为没有简单的方法来创建仅接受特定类型对象的容器。容器要幺以类或接口的所有子类型运行,通常Object,或为每个包含的类创建不同的容器类。仿制药允许编译时类型检查,而无需创建许多容器类,每个类别都包含几乎相同的代码。除了启用更有效的代码外,还可以通过发出编译时间错误来防止某些运行时异常。如果Java阻止了所有运行时类型错误(ClassCastExceptions)从发生,它将是安全的

在2016年,Java的类型系统被证明是不合适的,因为可以使用仿制药构建类和方法,从而使一个实例一个类分配给另一个无关类的变量。此类代码被编译器接受,但在运行时失败,类铸造异常。

批评

针对Java的批评包括仿制药的实施,速度,无符号数字的处理,浮点算术的实现以及在主要Java VM实现热点中的安全漏洞历史。

班级库

Java类库标准库,为支持Java的应用程序开发而开发。它由Oracle通过Java社区流程计划与他人合作控制。参加此过程的公司或个人会影响API的设计和开发。在2010年代,这个过程一直是争议的主题。班级库包含以下功能:

文件

Javadoc是由Sun Microsystems创建的综合文档系统。它为开发人员提供了一个有组织的系统来记录其代码。 Javadoc评论一开始就有一个额外的星号,即定界者是/***/,而Java中的正常多行评论由/**/,单行评论以//.

实施

Oracle Corporation是Java SE平台正式实施的当前所有者,他们于2010年1月27日收购了Sun Microsystems 。此实施基于Sun的Java的原始实施。 Oracle实现可用于Microsoft Windows (仍然适用于XP,而目前仅官方支持后期版本), MACOSLinuxSolaris 。由于Java缺乏ECMA International ,ISO/IEC,ANSI或其他第三方标准组织认可的任何正式标准化,因此Oracle实施是事实上的标准

Oracle实现将两个不同的分布打包为:Java运行时环境(JRE),其中包含运行Java程序所需的Java SE平台的各个部分,并用于最终用户,以及Java Development套件(JDK),该套件( JDK)对于软件开发人员,包括开发工具,例如Java编译器JavadocJarDebugger 。 Oracle还发布了Graalvm ,这是一款高性能Java动态编译器和解释器。

OpenJDK是另一个著名的Java SE实现,该实现已获得GNU GPL下的许可。当Sun开始在GPL下发布Java源代码时,实施开始。从Java SE 7开始,OpenJDK是Java官方参考实施。

Java的目标是使Java的所有实现兼容。从历史上看,Sun的Java品牌使用商标许可证坚持认为所有实施都是兼容的。在Sun声称Microsoft实施不支持Java远程方法调用(RMI)或Java本机接口(JNI)并添加了自己的平台特定功能之后,这导致了与Microsoft的法律纠纷。太阳于1997年起诉,并于2001年赢得了2000万美元的和解,以及法院命令执行Sun许可的条款。结果,Microsoft不再带有Windows的Java。

独立于平台的Java对于Java EE至关重要,需要更严格的验证才能证明实施。此环境启用便携式服务器端应用程序。

在Java平台外使用

Java编程语言需要存在软件平台,以便执行编译的程序。

Oracle提供可与Java一起使用的Java平台Android SDK是一个替代软件平台,主要用于使用其GUI系统开发Android应用程序

安卓

Java语言是开源移动操作系统Android的关键支柱。尽管基于Linux内核的Android主要用C编写,但Android SDK使用Java语言作为Android应用程序的基础,但不使用其任何标准GUI,SE,ME或其他已建立的Java标准。由Android SDK支持的字节码语言与Java字节码不兼容,并在其自己的虚拟机上运行,​​该虚拟机已针对智能手机平板电脑等低内存设备进行了优化。根据Android版本,字节码要幺由Dalvik虚拟机解释,要幺由Android运行时编译为本机代码。

尽管Android SDK确实包含了大部分子集的独立实现,但Android不提供完整的Java SE标准库。它支持Java 6和一些Java 7功能,提供与标准库( Apache Harmony )兼容的实现。

争议

在Android中使用与Java相关的技术导致了Oracle和Google之间的法律纠纷。 2012年5月7日,旧金山陪审团发现,如果可以将API受到版权保护,那么Google就通过在Android设备中使用Java侵犯了Oracle的版权。地区法官威廉·阿尔斯普(William Alsup)于2012年5月31日裁定,API不能受到版权保护,但这是由美国联邦巡回上诉法院于2014年撤销的。2016年5月26日,地方法院裁定有利于Google的地方法院。 ,统治Android中Java API的版权构成公平使用。 2018年3月,该裁决被上诉法院推翻,该裁决降低了确定旧金山联邦法院损害赔偿的案件。 Google于2019年1月向美国最高法院提交了证明令状请愿书,以挑战上诉法院对Oracle的支持的两项裁决。 2021年4月5日,法院以6-2裁定Google的支持,其使用Java API应被视为合理使用。但是,法院拒绝裁定API的版权性,而是选择通过考虑Java的API版权“纯粹是出于争论的目的”来确定其裁决。

也可以看看

Java与其他语言的比较