Java 语言是美国 Sun 公司(Stanford University Network)在 1995 年推出的计算机语言

Java 之父:詹姆斯·高斯林(James Gosling)

2009 年,Sun 公司被甲骨文公司收购,所以我们现在访问 Oracle官网即可

Java 程序执行过程

Java 语言可以跨平台运行其原理为:Java 程序并非是直接运行的,Java 编译器将 Java 源程序编译成与平台无关的字节码文件(class 文件),然后由 Java 虚拟机(JVM)对字节码文件解释执行。所以在不同的操作系统下,只需安装不同的 Java 虚拟机即可实现 Java 程序的跨平台。

Java 源文件(*.java)通过 javac 命令编译成字节码文件(*.class)在使用 java 命令解释执行为特定的机器码。

什么是字节码?采用字节码的好处是什么?

:::info 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器。因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。 :::

Java 简介 - 图1
▲ 一次编译,处处运行

Java 语言中负责解释执行字节码文件的是 Java 虚拟机,即 JVM(Java Virtual Machine)

Java 开发环境

JDK 与 JRE

Java 标准版开发包,JDK(Java SE Development Kit),是一套用于开发 Java 应用程序的开发包,它提供了编译、运行 Java 程序所需的各种工具和资源,包括 Java 编译器、Java 运行环境,以及常用的 Java 类库等。JRE 则是 Java 运行时环境 Java Runtime Environment。

  • 如果只是运行 Java 程序,只需要安装 JRE,无需安装 JDK
  • 如果需要开发 Java 程序,应该安装 JDK,安装后就包含了 JRE

Java SE 与 Java EE

随着 Java 的发展,SUN 给 Java 又分出了三个不同版本:

  • Java SE(Standard Edition)标准版,包含标准的 JVM 和标准库
  • Java EE(Enterprise Edition)企业版,它只是在 Java SE 的基础上加上了大量的 API 和库,以便方便开发 Web 应用、数据库、消息服务等。Java EE 的应用使用的虚拟机和 Java SE 完全相同。2018年3月,开源组织 Eclipse 基金会宣布,Java EE 被更名为 Jakarta EE。
  • Java ME(Micro Edition)针对嵌入式设备的“瘦身版”,Java SE 的标准库无法在 Java ME 上使用,Java ME 的虚拟机也是“瘦身版”

:::info 从 JDK 5.0 开始 J2EE 改名为 Java EE,J2SE 改名为 Java SE,J2ME 改名成 Java ME :::

Java 学习指南

  1. 首先要学习 Java SE,掌握 Java 语言本身、Java 核心开发技术以及 Java 标准库的使用;
  2. 如果继续学习 Java EE,那么 Spring 框架、数据库开发、分布式架构就是需要学习的;
  3. 如果要学习大数据开发,那么 Hadoop、Spark、Flink 这些大数据平台就是需要学习的,他们都基于 Java 或 Scala 开发;
  4. 如果想要学习移动开发,那么就深入 Android 平台,掌握 Android App 开发。

JDK 下的命令

JDK 目录下的bin,该路径下存放了JDK 的各种工具命令:

  • java:这个可执行程序其实就是 JVM,运行 Java 程序,就是启动 JVM,然后让 JVM 执行指定的编译后的代码;
  • javac :这是 Java 的编译器,它用于把 Java 源码文件(以 .java 后缀结尾)编译为 Java 字节码文件(以.class后缀结尾);
  • jar :用于把一组.class文件打包成一个 .jar 文件,便于发布;
  • javadoc:用于从 Java 源码中自动提取注释并生成文档;
  • jdb :Java 调试器,用于开发阶段的运行调试。

Java 程序的组织形式

Java 程序包括:注释、包声明、导入语句、类定义、包含实际代码的方法

Java 简介 - 图2

  1. public class Hello {
  2. // Java 程序的入口方法,程序将从这里开始执行
  3. public static void main(String[] args){
  4. // 向控制台打印一条语句,Java 程序严格区分大小写
  5. System.out.println("Hello Word!");
  6. }
  7. }

所有的程序都必须放到类的定义里。

如果某个类能被解释器直接解释执行,则这个类里必须包含 main 方法,而且 main 方法必须使用 pubilc static void 来修饰,且 main 方法的形必须是字符串数组类型( String[] args 是字符串数组的形式)

Java 基本语法

编写 Java 程序时,应注意以下几点:

  • 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hellohello 是不同的。
  • 类名采用大驼峰命名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass
  • 方法名采用小驼峰命名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
  • 源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。如果源代码定义了一个 public 类,则该源文件的主文件名必须与该 public 类名相同。因此一个 Java 源文件只能定义一个 public 类。
  • 主方法入口:所有的 Java 程序由 public static void main(String []args) 方法开始执行。

Java 标识符

Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符

关于 Java 标识符,有以下几点需要注意:

  • 所有的标识符都应该以字母( A-Z 或者 a-z),美元符($)、或者下划线(_)开始
  • 数字不可以开头
  • 首字符之后可以是字母( A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合
  • 关键字、保留字不能用作标识符
  • 标识符是大小写敏感的,不能包含空格
  • 合法标识符举例:age、$salary、_value、__1_value
  • 非法标识符举例:123abc、-salary

Java 命名规范:

  • 包名:多单词组成时所有字母都小写:xxxyyyzzz
  • 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
  • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
  • 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

Java 修饰符

① 访问控制修饰符

Java 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

  • default(即默认,什么也不写):在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方er法。
  • private : 在同一类内可见。使用对象:变量、方法。
  • public :对所有类可见。使用对象:类、接口、变量、方法
  • protected :对同一包内的类和所有子类可见。使用对象:变量、方法。

Java 的外部类为什么不能使用 private、protected 进行修饰

② 非访问修饰符

为了实现一些其他的功能,Java 也提供了许多非访问修饰符。

  • static:用来修饰类方法和类变量。
  • final:用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
  • abstract:用来创建抽象类和抽象方法。
  • synchronizedvolatile:主要用于线程的编程。

static 修饰符:

  • 静态变量:static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
  • 静态方法:static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
  • 对类变量和方法的访问可以直接使用 classname.variablenameclassname.methodname 的方式访问。

final 修饰符:

  • final 变量:final 表示”最后的、最终的”含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。
  • final 修饰符通常和 static 修饰符一起使用来创建类常量

abstract 修饰符:

  • 抽象类:抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
  • 一个类不能同时被 abstractfinal 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
  • 抽象类可以包含抽象方法和非抽象方法。

Java 保留词

访问控制 private protected public



类,方法和变量修饰符 abstract class extends final implements interface native
new static strictfp synchronized transient volatile
程序控制 break continue return do while if else
for instanceof switch case default

错误处理 try catch throw throws finally

包相关 import package




基本类型 boolean byte char double float int long
short null true false


变量引用 super this void



保留字 goto const




Java 类

因为 Java 是面向对象的语言,一个程序的基本单位就是classclass是关键字,这里定义的class 名字就是Hello

public class Hello { // 类名是Hello
    // ...
} // class定义结束

注意到 public 是访问修饰符,表示该 class 是公开的。不写 public,也能正确编译,但是这个类将无法从命令行执行。

class内部,可以定义若干方法(method):

public class Hello {
    public static void main(String[] args) { // 方法名是main
        // 方法代码...
    } // 方法定义结束
}

方法定义了一组执行语句,方法内部的代码将会被依次顺序执行。这里的方法名是 main,返回值是 void,表示没有任何返回值。

我们注意到 public 除了可以修饰 class 外,也可以修饰方法。而关键字 static 是另一个修饰符,它表示静态方法。

Java 入口程序规定:

  • 方法必须是静态方法
  • 方法名必须为 main
  • 括号内的参数必须是 String 数组。

注释

在方法内部,语句才是真正的执行代码。Java 的每一行语句必须以分号结束

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!"); // 语句
    }
}

在 Java 程序中,注释是一种给人阅读的文本,不是程序的一部分,所以编译器会自动忽略注释。

Java 有 3 种注释,第一种是单行注释,以双斜线开头,直到这一行的结尾结束:

// 这是注释...

而多行注释以 /* 星号开头,以 */ 结束,可以有多行:

/*
这是注释
blablabla...
这也是注释
*/

还有一种特殊的多行注释,以 /** 开头,以 */ 结束,如果有多行,每行通常以星号开头:

/**
 * 可以用来自动创建文档的注释
 * 
 * @auther liaoxuefeng
 */
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

这种特殊的多行注释需要写在类和方法的定义处,可以用于自动创建文档。

Java 程序对格式没有明确的要求,多几个空格或者回车不影响程序的正确性,但是我们要养成良好的编程习惯,注意遵守 Java 社区约定的编码格式。

变量

在 Java 中,变量必须先定义后使用,在定义变量的时候,可以给它一个初始值。

public class Main {
    public static void main(String[] args) {
        int x = 100;            // 定义 int 类型变量 x,并赋予初始值 100
        System.out.println(x);  // 打印该变量的值
    }
}

变量的一个重要特点是可以重新赋值, 还可以赋值给其他变量

变量命名规则:

  • 名字必须以字母或下划线开头
  • 名字中所有其他字符必须是字母、数字和下划线。名字中不能出现空格或其他特殊字符。
  • 名字不能是任何保留词