Java 基础语法
在 Java 编程世界里,一个 Java 程序可以看作是一系列对象的集合,这些对象通过相互调用彼此的方法来协同工作,共同完成各种复杂的任务。接下来,让我们一起深入了解类、对象、方法和实例变量的基本概念。
- 对象:对象是类的一个具体实例,它拥有自己独特的状态和行为。以狗为例,一条狗就是一个对象,它的状态可以包括颜色、名字、品种等属性;而它的行为则有摇尾巴、叫、吃等动作。
- 类:类就像是一个模板,它详细描述了一类对象所共有的行为和状态。通过这个模板,我们可以创建出一个个具体的对象。
- 方法:方法代表着对象的行为,一个类中可以包含多个方法。无论是复杂的逻辑运算、数据的修改操作,还是其他各种动作,都是在方法中完成的。
- 实例变量:每个对象都有属于自己的独特实例变量,这些实例变量的值共同决定了对象的状态。
目录
第一个 Java 程序
让我们先来看一个简单的 Java 程序,它的功能是输出字符串 “Hello World”。这个经典的程序就像是编程世界的 “敲门砖”,引领我们开启 Java 编程之旅。
实例:
public class HelloWorld {
/* 第一个Java程序
* 它将输出字符串 Hello World
*/
public static void main(String[] args) {
System.out.println("Hello World"); // 输出 Hello World
}
}
接下来,我们逐步介绍如何保存、编译以及运行这个程序:
- 打开代码编辑器,将上述代码完整地添加进去。
- 把文件名保存为 “HelloWorld.java”,请务必注意文件名要和类名完全一致,并且 Java 是大小写敏感的。
- 打开 cmd 命令窗口,通过命令进入目标文件所在的位置,假设文件存放在 C 盘根目录下。
- 在命令行窗口中输入 “javac HelloWorld.java”,然后按下回车键开始编译代码。如果代码没有任何错误,并且环境变量都已正确设置,cmd 命令提示符会自动进入下一行。
- 编译成功后,再输入 “java HelloWorld” 并按下回车键,就可以运行程序了。此时,你将会在窗口中看到输出的 “Hello World”。
$ javac HelloWorld.java
$ java HelloWorld
Hello World
倘若在编译过程中遇到编码问题,我们可以使用-encoding
选项将编码设置为utf-8
来进行编译,具体命令如下:
javac -encoding UTF-8 HelloWorld.java
java HelloWorld
基本语法
在编写 Java 程序时,有一些关键的要点需要我们时刻牢记:
- 大小写敏感:Java 对大小写非常敏感,这就意味着标识符 “Hello” 与 “hello” 是完全不同的,在编程过程中一定要严格区分。
- 类名:对于所有的类来说,类名的首字母通常应该大写。如果类名由多个单词组成,那么每个单词的首字母都应该大写,例如 “MyFirstJavaClass” ,这样的命名规范有助于提高代码的可读性。
- 方法名:所有的方法名都应该以小写字母开头。当方法名包含多个单词时,后面的每个单词首字母大写,例如 “calculateSum” ,遵循这样的命名规则可以使代码结构更加清晰。
- 源文件名:源文件名必须和类名完全相同。在保存文件时,一定要使用类名作为文件名,并加上后缀 “.java”。如果文件名和类名不一致,将会导致编译错误,所以这一点务必注意。
- 主方法入口:所有的 Java 程序都是从
public static void main(String[] args)
方法开始执行的,这个方法就像是程序的 “起点”,程序从这里开始一步步执行各种操作。
Java 标识符
在 Java 中,所有的组成部分都需要有自己的名字,类名、变量名以及方法名都被称为标识符。关于 Java 标识符,有以下几个重要的规则需要我们遵守:
- 所有的标识符都应该以字母(A-Z 或者 a-z)、美元符($)或者下划线(_)开始。
- 首字符之后可以是字母(A-Z 或者 a-z)、美元符($)、下划线(_)或数字的任意字符组合。
- 关键字不能用作标识符,因为关键字在 Java 中有特殊的含义和用途。
- 标识符是大小写敏感的,例如 “myVariable” 和 “myvariable” 是两个不同的标识符。
- 合法标识符举例:age、$salary、_value、__1_value 。
- 非法标识符举例:123abc、-salary ,这些不符合标识符命名规则,在编程中要避免使用。
Java 修饰符
和其他编程语言类似,Java 可以使用修饰符来修饰类中的方法和属性,从而实现更灵活的编程控制。Java 中的修饰符主要分为两类:
- 访问控制修饰符:包括 default、public、protected、private 。这些修饰符用于控制类、方法和变量的访问权限,决定了它们在不同的作用域中是否可见和可访问。
- 非访问控制修饰符:例如 final、abstract、static、synchronized 。这些修饰符为方法和属性赋予了不同的特性,比如 final 可以用于修饰不可变的常量,abstract 用于定义抽象类和抽象方法等。
在后续的学习中,我们会深入探讨 Java 修饰符的具体用法和应用场景,它们将帮助我们编写出更加健壮和安全的代码。
Java 变量
在 Java 中,主要有以下几种类型的变量:
- 局部变量:局部变量是在方法内部声明的变量,它的作用域仅限于方法内部,只在方法执行期间存在。
- 类变量(静态变量):类变量是使用 static 关键字修饰的变量,它属于类本身,而不是类的某个实例。无论创建多少个类的实例,类变量都只有一份,并且可以通过类名直接访问。
- 成员变量(非静态变量):成员变量是在类中声明,但在方法外部的变量,它属于类的每个实例。每个实例都有自己独立的成员变量副本,通过实例对象可以访问和修改成员变量的值。
Java 数组
数组是一种在 Java 中广泛使用的数据结构,它用于存储多个同类型的变量。数组中的元素在内存中是连续存储的,这使得对数组元素的访问和操作更加高效。数组在 Java 中是作为对象来处理的,它存储在堆内存中。在后续的学习中,我们将详细学习如何声明、构造以及初始化一个数组,掌握数组的使用方法对于编写高效的 Java 程序至关重要。
Java 枚举
Java 5.0 引入了枚举这一强大的特性,枚举可以将变量的取值限制为预先设定好的几个值。通过使用枚举,我们可以有效地减少代码中的潜在错误,提高代码的可读性和可维护性。
例如,我们为一家果汁店设计一个程序,为了规范果汁的售卖尺寸,我们可以使用枚举来限制果汁的尺寸只能是小杯、中杯、大杯。这样一来,就避免了顾客点单时出现不符合规定尺寸的情况,确保了程序的准确性和稳定性。
实例:
class FreshJuice {
enum FreshJuiceSize{ SMALL, MEDIUM, LARGE }
FreshJuiceSize size;
}
public class FreshJuiceTest {
public static void main(String[] args){
FreshJuice juice = new FreshJuice();
juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
}
}
**注意:**枚举可以单独声明,也可以声明在类里面。在枚举中,我们还可以定义方法、变量和构造函数,进一步丰富了枚举的功能和应用场景。
Java 关键字
Java 关键字是 Java 语言中预先定义好的具有特殊含义的单词,这些保留字不能用于常量、变量和任何标识符的名称。下面我们通过一个表格来详细列出 Java 关键字及其说明:
类别 | 关键字 | 说明 |
---|---|---|
访问控制 | private | 私有的 |
protected | 受保护的 | |
public | 公共的 | |
default | 默认 | |
类、方法和变量修饰符 | abstract | 声明抽象 |
class | 类 | |
extends | 扩充、继承 | |
final | 最终值、不可改变的 | |
implements | 实现(接口) | |
interface | 接口 | |
native | 本地、原生方法(非 Java 实现) | |
new | 创建 | |
static | 静态 | |
strictfp | 严格浮点、精准浮点 | |
synchronized | 线程、同步 | |
transient | 短暂 | |
volatile | 易失 | |
程序控制语句 | break | 跳出循环 |
case | 定义一个值以供 switch 选择 | |
continue | 继续 | |
do | 运行 | |
else | 否则 | |
for | 循环 | |
if | 如果 | |
instanceof | 实例 | |
return | 返回 | |
switch | 根据值选择执行 | |
while | 循环 | |
错误处理 | assert | 断言表达式是否为真 |
catch | 捕捉异常 | |
finally | 有没有异常都执行 | |
throw | 抛出一个异常对象 | |
throws | 声明一个异常可能被抛出 | |
try | 捕获异常 | |
包相关 | import | 引入 |
package | 包 | |
基本类型 | boolean | 布尔型 |
byte | 字节型 | |
char | 字符型 | |
double | 双精度浮点 | |
float | 单精度浮点 | |
int | 整型 | |
long | 长整型 | |
short | 短整型 | |
变量引用 | super | 父类、超类 |
this | 本类 | |
void | 无返回值 | |
保留关键字 | goto | 是关键字,但不能使用 |
const | 是关键字,但不能使用 |
**注意:**Java 的 null 不是关键字,它类似于 true 和 false,是一个字面常量,用于表示空值,并且不允许作为标识符使用。在编程中,我们经常会使用 null 来初始化对象引用,表示该引用不指向任何对象。
Java 注释
和 C/C++ 语言一样,Java 也支持单行注释和多行注释。注释的作用是为代码添加说明和解释,提高代码的可读性和可维护性。注释中的字符会被 Java 编译器忽略,不会影响程序的运行。
public class HelloWorld {
/* 这是第一个Java程序
* 它将输出 Hello World
* 这是一个多行注释的示例
*/
public static void main(String[] args){
// 这是单行注释的示例
/* 这个也是单行注释的示例 */
System.out.println("Hello World");
}
}
如果想深入了解更多关于 Java 注释的内容,可以参考:Java 注释 。在实际编程中,合理地使用注释可以让代码更加清晰易懂,方便自己和他人阅读和维护代码。
Java 空行
在 Java 程序中,空白行或者包含注释的行,Java 编译器都会自动忽略掉。虽然空行在程序运行时没有实际的作用,但它可以用于分隔代码块,使代码结构更加清晰,提高代码的可读性。在编写代码时,我们可以适当地使用空行来组织代码,让代码看起来更加整洁和有条理。
继承
在 Java 中,一个类可以从其他类派生而来。当我们创建一个新类时,如果已经存在一个类具有我们所需要的属性或方法,那么我们可以让新类继承这个已有的类。通过继承,我们可以重用已存在类的方法和属性,避免重复编写代码,大大提高了开发效率。
在继承关系中,被继承的类称为超类(super class),也叫做父类;派生出来的类称为子类(sub class),也叫做派生类。子类可以继承父类的非私有属性和方法,并且还可以根据自身需求添加新的属性和方法,或者重写父类的方法,实现更加个性化的功能。
接口
在 Java 中,接口可以理解为对象之间相互通信的协议。接口在 Java 的继承体系中扮演着非常重要的角色,它为类提供了一种更加灵活的多继承方式。
接口只定义了方法的签名,也就是方法的名称、参数列表和返回类型,但不包含方法的具体实现。接口的实现完全由实现该接口的类来完成,这使得不同的类可以根据自身的需求来实现接口中定义的方法,从而实现不同的功能。通过接口,我们可以将不同类的共同行为抽象出来,提高代码的可扩展性和可维护性。
Java 源程序与编译型运行区别
Java 源程序是我们编写的包含 Java 代码的文本文件,通常以.java 为后缀。在运行 Java 程序之前,需要先使用 Java 编译器(javac)将源程序编译成字节码文件,字节码文件以.class 为后缀。字节码文件是一种中间形式的代码,它不能直接在操作系统上运行,而是需要在 Java 虚拟机(JVM)中运行。
Java 虚拟机负责加载字节码文件,并将字节码解释或编译成机器码,然后在不同的操作系统上运行。这种编译型和解释型相结合的运行方式,使得 Java 程序具有 “一次编写,到处运行” 的特性,即 Java 程序可以在不同的操作系统和硬件平台上运行,而无需重新编写代码。
如下图所示,清晰地展示了 Java 源程序从编写到编译、运行的整个过程:
通过对 Java 基础语法的学习,我们对 Java 编程有了初步的认识。这些基础知识是我们进一步学习 Java 的基石,只有扎实掌握了这些内容,才能在后续的学习和实践中更加得心应手。在未来的学习中,我们还将深入探讨 Java 的各种高级特性和应用场景,不断提升自己的编程能力。