一、Java语言简介
Java是面向对象的高级编程语言。其特殊性显著:
- 具备平台无关性,代码编译成字节码,依托JVM可跨平台运行;
- 有自动内存管理,垃圾回收机制让开发者无需手动释放内存;
- 支持多线程,能高效处理并发任务;
- 拥有丰富类库,涵盖网络、文件等多领域,提升开发效率;
- 注重安全,有字节码验证、安全管理器等保障;
- 还支持分布式计算,像RMI可实现远程方法调用,适应大规模系统开发。
二、数据类型
Java 数据类型分两类:
基本数据类型(8种):
- 整数型:byte、short、int、long
- 浮点型:float、double
- 字符型:char
- 布尔型:boolean
引用数据类型:
- 类(class):如 String 等
- 接口(interface)
- 数组(array)
基本数据类型存储值,占用固定内存;
引用数据类型存储对象引用,可表示复杂数据结构。
三、变量与常量
3.1 什么是变量和常量,它们的区别是什么?
答:
变量是程序中可以改变值的存储单元,用于存储数据,在程序执行过程中其值可以被修改。
常量是在程序运行过程中值不能被改变的量,使用 final 关键字修饰。
区别在于变量值可变,常量值不可变。
3.2 Java标识符的命名规则
答:
(1) 基本命名规则:
这些规则是强制性的,违反规则会导致编译错误:
- 组成元素: 标识符可以由字母(包含英文字母大小写、中文、日文等)、数字、下划线_、以及美元符号 $ 组成。不过,数字不能作为标识符的开头。
例如,myVariable、_count、$price 都是合法的,但 123abc 不合法。 - 区分大小写: Java 是大小写敏感的语言,所以 myVariable 和 MyVariable 是两个不同的标识符。
- 不能是关键字或保留字: 不能使用 Java 的关键字(如 class、public、if 等)和保留字(如 goto、const 等)作为标识符。
(2) 常见命名规范(非强制,但推荐遵循)
这些规范有助于提高代码的可读性和可维护性:
- 类名:大驼峰命名法:
每个单词的首字母大写,其余字母小写。
例如,Person、StudentInfo、DataProcessor 等。
这种命名方式能清晰反映类的功能或代表的事物。 - 变量名:小驼峰命名法、见名知意
小驼峰命名法:第一个单词首字母小写,后续每个单词首字母大写。
例如,age、studentName、totalAmount 等。
这样命名能直观体现变量的用途。
见名知意:变量名应具有描述性,让人一看就明白该变量存储的是什么数据。
比如,用 studentCount 表示学生数量,而不是使用无意义的 a、b 等。 - 方法名:小驼峰命名法、动词开头
小驼峰命名法:和变量名类似,第一个单词首字母小写,后续每个单词首字母大写。
例如,getAge()、calculateTotal()、printInfo() 等。
动词开头:方法通常表示一个动作,所以方法名一般以动词开头,清晰表达该方法的功能。 - 常量名:全部大写
单词之间用下划线 _ 分隔。
例如,MAX_VALUE、PI、DEFAULT_TIMEOUT 等。
这样能明显区分常量和其他变量。 - 包名:全小写
通常采用域名反转的形式,以保证包名的唯一性。
例如,一个公司的域名是 example.com,其包名可能是 com.example.project 。
四、运算符
4.1 逻辑与(&&)和按位与(&)有什么区别?
答:
逻辑与(&&)是短路运算符,当第一个操作数为 false 时,不会再计算第二个操作数。
按位与(&)会对两个操作数的每一位进行与运算,无论第一个操作数结果如何,都会计算第二个操作数。
4.2 逻辑或(||)和按位或(|)有什么区别?
答:
逻辑或(||)是短路运算符,当第一个操作数为 true 时,不会再计算第二个操作数。
按位或(|)会对两个操作数的每一位进行或运算,无论第一个操作数结果如何,都会计算第二个操作数。
4.3 请简要说明 i++ 和 ++i 的区别。
答:
i++ 是后置自增运算符,先返回 i 的当前值,然后再将 i 的值加 1;
++i 是前置自增运算符,先将 i 的值加 1,然后再返回 i 增加后的值。
比如:
int a = 5;
int b = 3;
int c = a++ + b;
// 此时a=6,b=3,c=8
a = 5;
b = 3;
int d = ++a + b;
// 此时a=6,b=3,d=9
五、循环语句
5.1 题目 1:for、while 和 do-while 循环的区别是什么?
答:
- 执行顺序:
- for 和 while 循环先判断条件,条件为真才执行循环体;
- do-while 循环先执行一次循环体,再判断条件,所以 do-while 循环至少会执行一次循环体。
- 适用场景:
- for 循环适用于已知循环次数的场景;
- while 循环适用于循环次数未知,仅根据条件判断是否继续循环的场景;
- do-while 循环适用于需要先执行一次操作,再根据条件决定是否继续循环的场景。
5.2 在 循环中使用 break
和 continue
语句有什么作用?
答:
break
语句用于终止整个循环,跳出循环体执行循环之后的代码。
例如在一个查找特定元素的for
循环中,找到元素后使用break
结束循环。
注意:如果是在嵌套循环,那么只能跳出当前所在的循环体,无法一次性跳出多层循环体continue
语句用于跳过本次循环的剩余部分,直接开始下一次循环。
例如在统计偶数和的循环中,遇到奇数时使用continue
跳过后续求和代码,继续下一次循环。
5.3 如何使用嵌套循环打印一个九九乘法表?
答:
可以使用两层 for 循环来实现,外层循环控制行数,内层循环控制每行的列数。
示例代码如下:
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + " * " + i + " = " + (i * j) + "\t");
}
System.out.println();
}
六、流程控制语句
6.1 简述 Java 中 if – else、switch 语句的使用场景及区别
答:
- if – else 语句适用于条件判断情况较为复杂,条件表达式为布尔类型的场景,可处理范围性的条件判断。
如判断成绩等级(0 – 59 为不及格等)。 - switch 语句适用于条件为固定离散值的场景。
如根据星期几执行不同操作。 - 区别在于 if – else 可处理更灵活的条件,switch 只能对基本数据类型(如 byte、short、int、char)、枚举类型和 String 类型进行等值判断。
6.2 分析以下 for
循环代码的执行结果,并解释执行流程
for (int i = 0; i < 5; i++) {
if (i == 3) {
continue;
}
System.out.println(i);
}
答: 执行结果为输出 0、1、2、4。
七、数组
7.1 如何声明、创建和初始化一个 Java 数组?
答:
声明数组有两种方式,以一维数组为例:
数据类型[] 数组名
,如int[] arr
;数据类型 数组名[]
,如int arr[]
。
创建数组使用 new 关键字。
如 arr = new int[5];
,表示创建一个长度为 5 的 int 型数组。
初始化数组有静态和动态两种方式。
- 静态初始化在声明时直接赋值,如
int[] arr = {1, 2, 3, 4, 5};
; - 动态初始化先创建数组,再为元素赋值,如
int[] arr = new int[5]; arr[0] = 1;
。
7.2 如何遍历一个 Java 数组?请列举至少两种方式
答:
普通 for 循环: 通过数组的索引访问元素,示例代码如下:
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
增强 for 循环: 适用于只需要顺序访问数组元素的场景,示例代码如下:
int[] arr = {1, 2, 3};
for (int num : arr) {
System.out.println(num);
}
7.3 Java 中数组作为方法参数和返回值时,传递的是什么?
答:
Java 中数组作为方法参数和返回值时,传递的是数组的引用,而不是数组本身。
这意味着在方法中对数组元素的修改会影响到原始数组。