Java(请不要与 JavaScript 搞混)是一种设计为与 Java 虚拟机 (JVM) 一起使用的多用途编程语言。一般 将 安装了相关工具可以开发并运行 Java 程序的电脑系统称为 “Java 运行平台”。使用这个标签可以(在StackOverflow上)查找有关 Java 编程语言或者 Java 平台工具的问题。
Java 是一种高性能、跨平台、 面向对象 的编程语言和运行环境。Java 大部分语法起源于 C 和 C++ ,但是其对象模型比 C++ 简单,并且减少了底层功能。Java 应用均被编译为 字节码 (被称为 class 文件),可以被 JVM (Java 虚拟机)执行,并独立于不同的计算机体系。 JVM 通过一个 垃圾收集器 (查看 garbage-collection )帮助管理内存,当对象不再使用时可以将其从内存中移除。Java 的 系统类型 是静态、强类型、安全、声明类型和显式的。Java 支持反射、接口等与 C 和 C++ 相似的功能,例如 JNI (The Java Native Interface)。
Java 被设计为尽可能减少与电脑系统的依赖关系,可以允许应用开发者 “一处编写,处处运行”( WORA ):在一个平台上执行的代码不需重新编译就能在其他机器上运行。Java 最初由 James Gosling 在 Sun Mircosystems 公司(2009年4月20日已被 Oracle 并购)设计,最初是于 1995 年作为 Sun Microsystems公司 Java 运行平台的核心组件发行。
安装工具用于开发和运行 Java 的计算机系统被 Sun(现为 Oracle)命名为 Java 平台 。各种具有平台特性的工具可以帮助开发者更有效率地使用 Java 程序语言开发。
平台包含两个基本的软件包:
在本节中,我们将进一步探讨这两个软件包作为 Java 平台的组成部分产生的作用。
作为参考的大部分 Java 实现方式都是开源的(
OpenJDK),由包括 Oracle、Apple、SAP 与 IBM 在内的大型企业提供支持。
极少的电脑可以直接运行 Java 程序。因此,Java 环境通常要求安装合适的软件组件。在 Windows 系统上,一般可以从 java.com 下载免费的 Java 运行环境(JRE)。在 Macintosh 系统上,当应用需要 Java 运行环境时,会在启动时请求用户下载 Java。在类 Linux 系统上,Java 一般通过包管理器安装。
Windows 和 Mac 平台的开发者经常需要额外的工具,使用工具所需的免费 Java 开发包(JDK)必须从 Oracle 下载并手动安装。
Java 会被编译为字节码,然后由 JVM 通过编译为原生代码进行解析。编译技术为即时编译(JIT)。最初这被视为降低性能的做法,但是随着 JVM 和 JIT 的发展,担忧逐渐减少。在某些情况下,例如当一个旧版本的处理器需要向后兼容时,JVM 甚至快于原生代码编译速度。
注意:也有其他供应商存在,然而大部分都有授权费。对于 linux 和其他平台,请查阅相关的操作系统文档。
主要的 Java 版本、代号和发布时间:
最新的稳定版本:
更多的代号及发布日期请访问 J2SE Code Names 。要查看 JDK 的版本发布日志请访问 Wikipedia 的 Java 版本历史文章。
Java SE 8 正在发布并且可 下载 。
公共更新 的结束日期(以前称为生命周期终止)为:
你是 Java 初学者或者需要帮助使你的第一个 Java 程序运行?请参看 Oracle Java 教程开始部分 。
询问问题前,请使用右上角的搜索栏查找是否已被询问(我们有很多相似的问题),并且阅读 《如何提出一个好的问题》 ,学习怎样吸引 Jon Skeet 回答你的问题。
Java 程序需要坚持下列的 命名规范 以提高可读性并降低意外错误出现的可能性。遵守这些命名规范,可以使他人阅读你的代码和帮助你时更加轻松。
类型名(类、接口、枚举等等)应以大写字母开头,随后的每个单词首字母大写。例如: String、
ThreadLocal
和 NullPointerException
。有时被称为 pascal case(帕斯卡命名法)。
方法名应使用 camelCased(驼峰式命名法),即它们应以小写字母开头,随后的每个单词首字母大写。例如:indexOf、printStackTrace、interrupt。
字段名应使用和方法名一样的驼峰式命名法。
常量表达式命名( static final
不可变对象)应被写为 ALL_CAPS形式,使用下划线分割每个单词。例如: YELLOW
、 DO_NOTHING_ON_CLOSE
。这同样适用于枚举类( Enum
)的变量命名。然而, static final
修饰可变对象时应使用驼峰式命名。
Hello World:你的第一个程序
Hello World程序代码为:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
编译和调用 Hello world 程序:
javac -d . HelloWorld.java java -cp . HelloWorld
Java 源代码被编译为中间代码(针对 Java 虚拟机 的字节码指令),然后可以被 java
命令执行。
更多信息:
人们常问的 Java 问题:
一般问题:
环境变量:
String
, StringBuilder
与 toString
:
SomeType@2f92e0f4
? equals
与 hashCode
:
equals()
和 ==
有什么不同 equals()
和 hashCode()
方法 Java Platform SE API:
nextInt()
后跳过 nextLine()
Map<Key, Value>
中的值 LinkedList<>
而不是 ArrayList<>
Arrays.asList()
HashMap
与 Hashtable
之间的区别 泛型:
List<Dog>
是 List<Animal>
的子类吗?为什么 Java 的泛型不支持隐式多态? 类与对象:
enum
对比 public static final
字段的类有何优势? 算法与转换:
+=
操作 调试:
NullPointerException
是什么,我应该如何修复? NoClassDefFoundError
错误? NoSuchMethodError
Thread
与多线程:
java.lang.Thread.interrupt()
做了什么? implements Runnable
对比 extends Thread
与操作系统交互:
Runtime.exec(String)
只在一些命令下产生作用? (提交者们,请仅仅列出经常被询问的问题。)