动手实践:零基础学Java | 面向对象编程的类与对象(基础)

7 阅读3分钟

动手实践

练习一:类的设计与对象创建

定义一个 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 中验证两个对象不是同一个(用 == 比较),但内容相同(逐个比较属性)。

扩展思考:如果属性中有引用类型(比如另一个自定义类的对象),简单的属性赋值能实现真正的克隆吗?为什么?