动手实践:
练习一:类的设计与对象创建
定义一个 Dog 类,包含属性 name(字符串)、age(整数)、color(字符串),以及一个方法 show() 用于打印狗狗的信息。然后在 main 方法中创建两个不同的 Dog 对象,并调用它们的 show() 方法。
提示:
- 成员变量可以有默认值,但最好通过对象来赋值。
show()方法不需要返回值,直接打印即可。
参考代码:
class Dog {
String name;
int age;
String color;
public void show() {
System.out.println("我是" + color + "色的" + name + "," + age + "岁。");
}
}
public class DogTest {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.name = "旺财";
dog1.age = 2;
dog1.color = "黄";
Dog dog2 = new Dog();
dog2.name = "来福";
dog2.age = 3;
dog2.color = "黑";
dog1.show();
dog2.show();
}
}
练习二:方法重载——计算器升级
在 Calculator 类中,为 add 方法实现多个重载版本,分别支持:
- 两个
int相加 - 两个
double相加 - 三个
int相加 - 一个
int和一个double相加(顺序可变)
在 main 方法中测试这些方法。
思考:返回值类型可以不同吗?为什么?
参考代码(仅展示部分):
public class Calculator {
public int add(int a, int b) { return a + b; }
public double add(double a, double b) { return a + b; }
public int add(int a, int b, int c) { return a + b + c; }
public double add(int a, double b) { return a + b; }
public double add(double a, int b) { return a + b; }
}
练习三:递归——斐波那契数列
斐波那契数列的定义是:第1项为1,第2项为1,从第3项起,每一项等于前两项之和。即 f(1)=1,f(2)=1,f(n)=f(n-1)+f(n-2) (n≥3)。请用递归方法编写一个函数 int fib(int n),返回第 n 项的值。并在 main 中打印前10项。
提示:不要忘记递归出口。
参考代码:
public static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
// 在 main 中测试
for (int i = 1; i <= 10; i++) {
System.out.print(fib(i) + " ");
}
练习四:可变参数——求任意数量数字的最大值
定义一个方法 max,接收可变参数的 int 数字,返回其中的最大值。如果调用时不传任何参数,则返回 Integer.MIN_VALUE。
提示:把可变参数当作数组处理即可。
参考代码:
public static int max(int... nums) {
if (nums.length == 0) {
return Integer.MIN_VALUE;
}
int maxValue = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > maxValue) {
maxValue = nums[i];
}
}
return maxValue;
}
练习五:构造器与 this 的使用
定义一个 Book 类,属性包括 title(书名)、price(价格)。要求:
- 提供无参构造器,在其中调用有参构造器,设置默认书名为“未知”,价格为0.0。
- 提供有参构造器,使用
this为属性赋值。 - 提供一个
setPrice方法,如果传入的价格小于0,则打印错误信息,否则修改价格。 - 在
main中测试不同方式创建对象,并调用setPrice方法。
参考代码:
class Book {
String title;
double price;
public Book() {
this("未知", 0.0); // 调用有参构造器
}
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public void setPrice(double price) {
if (price < 0) {
System.out.println("价格不能为负数!");
return;
}
this.price = price;
}
}
练习六(综合):对象克隆方法
模仿本讲中的 copyPerson 方法,为 Student 类编写一个 copyStudent 方法,返回一个与当前对象属性完全相同的新对象。然后在 main 中验证两个对象不是同一个(用 == 比较),但内容相同(逐个比较属性)。
扩展思考:如果属性中有引用类型(比如另一个自定义类的对象),简单的属性赋值能实现真正的克隆吗?为什么?