在Java编程的学习之旅中,有一些基础概念如同建筑的基石,至关重要。今天,Daniel将和大家一起深入探讨Java中的注释、标识符和关键字这三个基础且关键的部分。理解这些概念,不仅能帮助我们编写出更规范、易读的代码,还能让我们在后续的学习和开发中更加得心应手。
注释在Java代码中扮演着重要的角色,它就像是代码的说明书,用于解释代码的功能、逻辑和用途,方便自己和他人阅读和理解代码。Java中主要有三种注释方式:单行注释、多行注释和文档注释。
单行注释以 //
开头,从 //
开始到本行结束的所有内容都会被编译器忽略。它通常用于对代码的某一行进行简要说明。
示例代码如下:
public class CommentExample {
public static void main(String[] args) {
// 这是一个单行注释,用于说明下面这行代码的作用
int sum = 0; // 定义一个变量sum并初始化为0
for (int i = 1; i <= 10; i++) {
sum += i; // 累加i到sum中
}
System.out.println("1到10的和是:" + sum); // 输出累加结果
}
}
在上述代码中,//
后面的内容都是单行注释,对代码的功能和操作进行了简单解释。
多行注释以 /*
开头,以 */
结尾,中间的所有内容都会被编译器忽略。多行注释适用于对一段代码或一个功能模块进行详细说明。
示例代码如下:
public class MultiLineCommentExample {
public static void main(String[] args) {
/*
* 这是一个多行注释
* 下面这段代码的功能是计算1到100的偶数和
* 首先定义一个变量evenSum用于存储偶数和,初始化为0
* 然后通过for循环遍历1到100的数字
* 判断每个数字是否为偶数,如果是则累加到evenSum中
*/
int evenSum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
evenSum += i;
}
}
System.out.println("1到100的偶数和是:" + evenSum);
}
}
可以看到,多行注释可以跨越多行,对复杂的逻辑进行详细阐述。
文档注释以 /**
开头,以 */
结尾,它是Java特有的注释方式,主要用于生成API文档。文档注释中的内容可以通过javadoc工具提取出来,生成HTML格式的文档,方便开发者查看和使用。
示例代码如下:
/**
* 这是一个用于计算阶乘的类
* @author Daniel
* @version 1.0
*/
public class FactorialCalculator {
/**
* 计算一个整数的阶乘
* @param n 要计算阶乘的整数
* @return 返回n的阶乘值
*/
public static long factorial(int n) {
long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
public static void main(String[] args) {
int num = 5;
long fact = factorial(num);
System.out.println(num + "的阶乘是:" + fact);
}
}
在上述代码中,/**
和 */
之间的内容是文档注释。@author
用于指定作者,@version
用于指定版本,@param
用于描述方法的参数,@return
用于描述方法的返回值。通过javadoc工具对这些注释进行处理,可以生成详细的API文档。
标识符就是用于给Java中的变量、类、方法等命名的符号。标识符的命名需要遵循一定的规则:
下面是一些合法的标识符示例:userName
、_count
、$price
。
而以下是不合法的标识符示例:123name
(以数字开头)、class
(Java关键字)。
为了提高代码的可读性和可维护性,在命名标识符时,通常遵循一些命名规范:
Person
、StudentInfo
。userName
、calculateSum
。MAX_VALUE
、PI
。关键字是Java语言中预先定义好的、具有特殊含义的单词,不能用作标识符。以下是Java中的关键字列表:
关键字 | 讲解 |
---|---|
abstract | 用于声明抽象类或抽象方法。抽象类不能被实例化,只能被继承;抽象方法只有声明,没有实现,子类必须重写抽象方法(除非子类也是抽象类)。例如:abstract class Animal { abstract void makeSound(); } ,Animal 是抽象类,makeSound 是抽象方法。 |
assert | 用于进行断言,用来在程序中设置检查点。当程序运行到断言处时,会验证断言后的表达式是否为真,如果为假则抛出 AssertionError 异常。一般在开发和测试阶段使用,帮助调试程序。例如:int x = 5; assert x == 5; 。 |
boolean | 用于声明布尔类型变量,其值只能是 true 或 false 。例如:boolean isJavaFun = true; 。 |
break | 主要用于 switch 语句和循环语句中。在 switch 语句中,用于终止某个 case 的执行;在循环语句(for 、while 、do - while )中,用于跳出当前循环。例如在 for 循环中:for (int i = 0; i < 10; i++) { if (i == 5) { break; } System.out.println(i); } ,当 i 等于 5 时,循环终止。 |
byte | 用于声明字节类型变量,占用 1 个字节(8 位)的内存空间,取值范围是 -128 到 127。例如:byte b = 10; 。 |
case | 用于 switch 语句中,与 switch 后的表达式值进行比较,根据不同的值执行相应的代码块。例如:int num = 2; switch (num) { case 1: System.out.println("One"); break; case 2: System.out.println("Two"); break; } 。 |
catch | 用于捕获异常,与 try 语句配合使用。当 try 代码块中发生异常时,会跳转到与异常类型匹配的 catch 代码块中执行。例如:try { int result = 1 / 0; } catch (ArithmeticException e) { System.out.println("除零错误"); } 。 |
char | 用于声明字符类型变量,占用 2 个字节的内存空间,用于存储单个字符。例如:char ch = 'A'; 。 |
class | 用于声明一个类,类是Java中面向对象编程的基本单位,用于封装数据和方法。例如:class Person { String name; void sayHello() { System.out.println("Hello"); } } 。 |
continue | 主要用于循环语句中,用于跳过当前循环中剩余的代码,直接进入下一次循环。例如在 for 循环中:for (int i = 0; i < 10; i++) { if (i % 2 == 0) { continue; } System.out.println(i); } ,该代码会跳过偶数,只输出奇数。 |
default | 在 switch 语句中,当没有任何 case 匹配时,执行 default 代码块;在注解中,也可以用于指定默认值。例如 switch 语句:int num = 5; switch (num) { case 1: System.out.println("One"); break; default: System.out.println("Other number"); } 。 |
do | 用于 do - while 循环语句,先执行一次循环体代码,然后再判断条件是否为真,如果为真则继续循环。例如:int i = 0; do { System.out.println(i); i++; } while (i < 5); 。 |
double | 用于声明双精度浮点数类型变量,占用 8 个字节的内存空间,用于存储带有小数部分的数值。例如:double d = 3.14; 。 |
else | 与 if 语句配合使用,当 if 后的条件表达式为假时,执行 else 代码块中的内容。例如:int x = 10; if (x > 10) { System.out.println("x大于10"); } else { System.out.println("x不大于10"); } 。 |
enum | 用于声明枚举类型,枚举类型是一种特殊的类,它限制变量的取值只能在一组预定义的常量中。例如:enum Day { MONDAY, TUESDAY, WEDNESDAY } 。 |
extends | 用于表示类的继承关系,子类通过 extends 关键字继承父类的属性和方法。例如:class Dog extends Animal { void bark() { System.out.println("汪汪叫"); } } ,Dog 类继承了 Animal 类。 |
final | 用于修饰类、方法和变量。修饰类时,表示该类不能被继承;修饰方法时,表示该方法不能被重写;修饰变量时,表示该变量为常量,只能被赋值一次。例如:final class FinalClass {} ,final void finalMethod() {} ,final int FINAL_VARIABLE = 10; 。 |
finally | 与 try - catch 语句配合使用,无论是否发生异常,finally 代码块中的代码都会被执行,通常用于释放资源等操作。例如:try { int result = 1 / 0; } catch (ArithmeticException e) { System.out.println("除零错误"); } finally { System.out.println("finally代码块执行"); } 。 |
float | 用于声明单精度浮点数类型变量,占用 4 个字节的内存空间,用于存储带有小数部分的数值。例如:float f = 3.14f; ,注意数值后要加 f 表示是单精度浮点数。 |
for | 用于 for 循环语句,通过初始化、条件判断和迭代三个部分控制循环的执行。例如:for (int i = 0; i < 5; i++) { System.out.println(i); } 。 |
if | 用于条件判断语句,根据条件表达式的真假决定是否执行相应的代码块。例如:int x = 10; if (x > 5) { System.out.println("x大于5"); } 。 |
goto | 是Java的保留关键字,目前Java中没有使用 goto 语句,它主要是为了与其他语言保持一定的兼容性。 |
if(重复展示说明保留情况,实际不重复写,这里为说明) | (同上 if 讲解,为完整展示表格结构列出,实际表格中不重复) |
implements | 用于类实现接口,一个类可以实现多个接口,通过实现接口中的方法来完成接口规定的功能。例如:interface Runnable { void run(); } class MyRunnable implements Runnable { public void run() { System.out.println("Running"); } } 。 |
import | 用于导入其他包中的类或接口,以便在当前类中使用。例如:import java.util.ArrayList; ,这样就可以在当前类中使用 ArrayList 类。 |
instanceof | 用于判断一个对象是否是一个特定类或接口的实例。例如:String str = "Hello"; if (str instanceof String) { System.out.println("str是String类的实例"); } 。 |
int | 用于声明整型变量,占用 4 个字节的内存空间,取值范围是 -2147483648 到 2147483647。例如:int num = 10; 。 |
interface | 用于声明接口,接口是一种抽象类型,它只包含抽象方法和常量,用于定义一组规范,类通过实现接口来遵循这些规范。例如:interface Drawable { void draw(); } 。 |
long | 用于声明长整型变量,占用 8 个字节的内存空间,取值范围更大。例如:long l = 1234567890L; ,数值后加 L 表示是长整型。 |
native | 用于修饰方法,表示该方法是用其他语言(如C、C++)实现的本地方法。Java通过JNI(Java Native Interface)调用本地方法。例如:native void nativeMethod(); 。 |
new | 用于创建一个对象的实例。例如:String str = new String("Hello"); ,通过 new 关键字创建了一个 String 对象。 |
package | 用于声明当前类所在的包,包用于组织和管理类,避免类名冲突。例如:package com.example; 。 |
private | 访问修饰符,用于修饰类中的成员变量和方法,表示这些成员只能在当前类内部被访问。例如:class MyClass { private int privateVar = 10; private void privateMethod() { System.out.println("私有方法"); } } 。 |
protected | 访问修饰符,用于修饰类中的成员变量和方法,表示这些成员可以在当前类、子类以及同一个包中的其他类中被访问。例如:class Parent { protected int protectedVar = 20; protected void protectedMethod() { System.out.println("受保护方法"); } } class Child extends Parent { void accessProtected() { System.out.println(protectedVar); protectedMethod(); } } 。 |
public | 访问修饰符,用于修饰类、成员变量和方法,表示这些成员可以被任何其他类访问。例如:public class PublicClass { public int publicVar = 30; public void publicMethod() { System.out.println("公共方法"); } } 。 |
return | 用于从方法中返回一个值(有返回值的方法)或者结束方法的执行(无返回值的方法)。例如:int add(int a, int b) { return a + b; } ,void printHello() { System.out.println("Hello"); return; } 。 |
short | 用于声明短整型变量,占用 2 个字节的内存空间,取值范围是 -32768 到 32767。例如:short s = 100; 。 |
static | 用于修饰成员变量和方法,静态成员属于类,而不是类的实例。可以通过类名直接访问静态成员。例如:class StaticExample { static int staticVar = 0; static void staticMethod() { System.out.println("静态方法"); } } ,可以通过 StaticExample.staticVar 和 StaticExample.staticMethod() 访问。 |
strictfp | 用于修饰类或方法,确保浮点数运算在不同的平台上具有一致的结果。例如:strictfp class StrictFpClass {} ,strictfp void strictFpMethod() {} 。 |
super | 在子类中用于引用父类的成员变量、方法和构造函数。例如在子类方法中:class Parent { void parentMethod() { System.out.println("父类方法"); } } class Child extends Parent { void childMethod() { super.parentMethod(); } } ,通过 super 调用父类方法。 |
switch | 用于多分支选择语句,根据表达式的值选择执行相应的 case 代码块。例如:int num = 2; switch (num) { case 1: System.out.println("One"); break; case 2: System.out.println("Two"); break; } 。 |
synchronized | 用于修饰方法或代码块,实现线程同步,保证在同一时刻只有一个线程可以访问该方法或代码块,避免多线程并发问题。例如:synchronized void synchronizedMethod() { System.out.println("同步方法"); } ,Object lock = new Object(); synchronized (lock) { System.out.println("同步代码块"); } 。 |
this | 在类的方法中用于引用当前对象,可以用于访问当前对象的成员变量和方法,也可以用于调用当前类的其他构造函数。例如:class ThisExample { int x; ThisExample(int x) { this.x = x; } void printX() { System.out.println(this.x); } } 。 |
throw | 用于抛出一个异常对象,通常在方法中遇到异常情况时使用。例如:void checkAge(int age) { if (age < 0) { throw new IllegalArgumentException("年龄不能为负数"); } } 。 |
throws | 用于在方法声明中指定该方法可能抛出的异常类型,调用该方法时需要进行异常处理。例如:void readFile() throws IOException { // 读取文件操作 } 。 |
transient | 用于修饰成员变量,表示该变量不需要被序列化。当对象进行序列化时,被 transient 修饰的变量不会被保存到序列化后的数据中。例如:class TransientExample implements Serializable { transient int transientVar = 10; } 。 |
try | 与 catch 和 finally 配合使用,用于捕获和处理异常。try 代码块中放置可能会发生异常的代码。例如:try { int result = 1 / 0; } catch (ArithmeticException e) { System.out.println("除零错误"); } finally { System.out.println("finally代码块执行"); } 。 |
void | 用于声明方法没有返回值。例如:void printMessage() { System.out.println("Hello"); } 。 |
volatile | 用于修饰成员变量,保证该变量在多线程环境下的可见性,即当一个线程修改了该变量的值,其他线程能够立即看到修改后的值。例如:class VolatileExample { volatile boolean flag = false; } 。 |
while | 用于 while 循环语句,只要条件表达式为真,就会一直执行循环体代码。例如:int i = 0; while (i < 5) { System.out.println(i); i++; } 。 |
这些关键字在Java语言中都有着特定的功能和用途。例如,public
用于修饰类、方法或变量,表示它们是公开的,可以被其他类访问;class
用于定义一个类;if
和 else
用于条件判断语句。
今天,Daniel和大家一起学习了Java中的注释、标识符和关键字。注释能够帮助我们提高代码的可读性和可维护性,单行注释、多行注释和文档注释各有其适用场景。标识符的命名需要遵循一定的规则和规范,以确保代码的规范性和易读性。而关键字则是Java语言的核心组成部分,它们具有特殊的含义和功能,不能被用作标识符。
掌握这些基础概念是学好Java编程的重要一步。希望大家在今后的学习和实践中,能够灵活运用这些知识,编写出高质量的Java代码。Daniel也会继续和大家一起探索Java的更多奥秘,敬请期待!