15、实现一个名为Car的类,该类模拟一辆沿x轴行驶的汽车,行驶时消耗汽油。提供按给定英里数行驶、向油箱添加给定加仑数汽油的方法,以及获取当前离原点的距离和燃油量的方法。在构造函数中指定燃油效率(英里/加仑)。这个类应该是不可变类吗?为什么是或为什么不是?
这个类不应该是不可变类。因为不可变类的实例一旦构造完成就不能改变,而 Car 类需要提供行驶和加油的方法,这会改变汽车的行驶距离和燃油量,即改变对象的状态,所以不适合设计为不可变类。
16、在RandomNumbers类中,提供两个静态方法randomElement,用于从整数数组或整数ArrayList中获取一个随机元素。(如果数组或ArrayList为空,则返回零)。为什么不能将这些方法作为int[]或ArrayList 的实例方法?
不能将这些方法作为 int[] 或 ArrayList<Integer> 的实例方法,是因为 Java 不允许向数组类型(如 int[] )添加新的实例方法,数组是 Java 内置的特殊类型,其行为和结构是固定的。而对于 ArrayList<Integer> ,虽然它是一个类,但修改标准库中的类来添加自定义实例方法不是一个好的做法,会破坏封装性和可维护性,并且标准库的类通常不应该被直接修改。此外,静态方法更适合这种通用的工具类功能,它不依赖于特定对象的状态。
17、重写Cal类,对System和LocalDate类使用静态导入。
import static java.lang.System.out;
import static java.time.LocalDate.of;
import java.time.DayOfWeek;
public class Cal {
public static void main(String[] args) {
int year = 2024;
int month = 1;
// 获取该月第一天的日期对象
var date = of(year, month, 1);
// 获取该日期是星期几
DayOfWeek weekday = date.getDayOfWeek();
int value = weekday.getValue();
// 打印星期几的标题
out.println(" Mon Tue Wed Thu Fri Sat Sun");
// 根据星期几的值打印空格,实现缩进
for (int i = 1; i < value; i++) {
out.print(" ");
}
// 循环打印该月的日期
while (date.getMonthValue() == month) {
out.printf("%4d", date.getDayOfMonth());
// 日期加一天
date = date.plusDays(1);
weekday = date.getDayOfWeek();
if (weekday.getValue() == 1) {
out.println();
}
}
}
}
上述代码通过静态导入 System.out 和 LocalDate.of 方法,避免了在使用时重复书写类名,使代码更简洁。
18、创建一个 HelloWorld.java 文件,在 ch01.sec01 包中声明一个 HelloWorld 类。将其放入某个目录,但不是 ch01/sec01 子目录。从该目录运行 javac HelloWorld.java。是否会生成类文件?类文件在哪里?然后运行 java HelloWorld。会发生什么?为什么?(提示:运行 javap HelloWorld 并研究警告消息。)最后,尝试运行 javac -d . HelloWorld.java。为什么这样更好?
运行 javac HelloWorld.java 会生成类文件,类文件会在当前目录生成。
运行 java HelloWorld 可能会报错,因为类定义在 ch01.sec01 包中,需要使用完整的包名来运行,即 java ch01.sec01.HelloWorld 。
运行 javap HelloWorld 可能会给出关于包名不匹配的警告。
使用 javac -d . HelloWorld.java 更好,因为 -d <

最低0.47元/天 解锁文章
170万+

被折叠的 条评论
为什么被折叠?



