第一次课程中的所有动手动脑的问题以及课后实验性的问题
(我将其以压缩包的形式上传到了博客的文件中)
https://files.cnblogs.com/files/blogs/848082/第一次课程.zip?t=1758794756&download=true
(一)枚举类型相关问题及结论
-
问题描述
运行 EnumTest.java 程序,分析运行结果,总结枚举类型的基本特性及用法。 -
实验结论
• 枚举类型属于引用类型,并非原始数据类型。其每个具体值都对应一个特定的对象,且相同的值引用同一个对象。
• 对于枚举类型的变量,可直接使用 “==” 运算符和 equals () 方法进行值的比对,二者执行结果等价。
• 枚举类型可通过 foreach 循环进行迭代遍历,也可在 switch 语句中使用。
• 枚举类型的取值可通过valueOf(String name)方法从字符串转换得到,通过values()方法获取所有枚举值数组。
(二)二进制编码相关问题及探究 -
问题描述
明确原码、反码、补码的概念,编写示例程序对正数、负数进行位操作,验证 Java 中数值的二进制表示方式。 -
核心概念
• 原码:符号位加数值的绝对值,正数符号位为 0,负数为 1,如 + 5 原码为 00000101,-5 原码为 10000101。
• 反码:正数反码与原码相同;负数反码为原码符号位不变,其余位取反,如 - 5 反码为 11111010。
• 补码:正数补码与原码相同;负数补码为反码加 1,如 - 5 补码为 11111011。 -
实验验证
-
结论
Java 中整数采用补码形式存储。从运行结果可见,负数的二进制表示为其补码形式,位运算(如取反)均基于补码进行计算。
(三)变量作用域与屏蔽原则问题 -
问题描述
分析如下代码的输出结果,探究 Java 中同名变量的屏蔽原则。
java
运行
public class Test {
private static int value=1;
public static void main(String[] args){
int value=2;
System.out.println(value);
}
} -
运行结果
输出结果为 2。 -
原理分析
Java 中变量遵循 “同名变量的屏蔽原则”:当局部变量与成员变量同名时,在局部变量的作用域内,局部变量会屏蔽成员变量,此时访问的变量为局部变量。若需访问被屏蔽的成员变量,可通过 “类名。成员变量名”(静态成员变量)或 “this. 成员变量名”(非静态成员变量)实现
(四)浮点数精度问题及解决方案 -
问题描述
运行 TestDouble.java 程序,观察输出结果,分析 double 类型计算不精确的原因,并探究解决方案。 -
实验代码与结果
-
精度问题原因
double 类型属于双精度浮点数,在计算机中以二进制形式存储。由于部分十进制小数(如 0.01)无法转换为有限长度的二进制小数,只能以近似值表示,因此在运算过程中会产生精度误差。 -
解决方案
使用java.math.BigDecimal类进行高精度计算,且构建 BigDecimal 对象时需使用字符串作为参数,避免直接使用 double 值(会保留原始精度误差)。示例代码:
(五)字符串拼接与运算符优先级问题 -
问题描述
分析如下代码的输出结果,解释产生差异的原因。
java
运行
public class StringConcatenation {
public static void main(String[] args) {
int X = 100;
int Y = 200;
System.out.println("X+Y=" + X + Y);
System.out.println(X + Y + "=X+Y");
}
} -
运行结果
-
原因分析
Java 中 “+” 运算符兼具算术运算和字符串拼接功能,其执行顺序遵循从左到右的结合性:
• 对于"X+Y=" + X + Y,先计算"X+Y=" + X,将 int 类型的 X 转换为字符串进行拼接,得到"X+Y=100",再与 Y 拼接,最终结果为"X+Y=100200"。
• 对于X + Y + "=X+Y",先计算X + Y的算术结果 300,再将结果与字符串"=X+Y"拼接,最终结果为"300=X+Y"。
import java.util.Random;
import java.util.Scanner;
public class RandomCodeGenerator {
// 验证码字符集:包含大写字母、小写字母、数字
private static final String CODE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
// 验证码长度
private static final int CODE_LENGTH = 6;
/*** 生成随机验证码* @return 6位随机验证码字符串*/
public static String generateVerificationCode() {Random random = new Random();StringBuilder codeBuilder = new StringBuilder();for (int i = 0; i < CODE_LENGTH; i++) {// 随机获取字符集中的索引int index = random.nextInt(CODE_CHARACTERS.length());// 拼接字符codeBuilder.append(CODE_CHARACTERS.charAt(index));}return codeBuilder.toString();
}/*** 验证用户输入的验证码是否正确* @param generatedCode 系统生成的验证码* @param userInput 用户输入的验证码* @return 验证结果(true:正确,false:错误)*/
public static boolean verifyCode(String generatedCode, String userInput) {// 忽略大小写验证(可根据需求调整为严格区分)return generatedCode.equalsIgnoreCase(userInput);
}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 生成验证码String verificationCode = generateVerificationCode();System.out.println("【验证码】" + verificationCode);// 提示用户输入System.out.print("请输入上方验证码:");String userInput = scanner.nextLine();// 验证并输出结果if (verifyCode(verificationCode, userInput)) {System.out.println("验证码输入正确!");} else {System.out.println("验证码输入错误,请重试!");}scanner.close();
}
}
具体图片请点击链接到我的文档查看