1.编写一个 Cat 类,实现 1 个 shout()方法,该方法可以输出小猫的叫声“喵”
2.修改以上程序,为 Cat 类声明一个字段 name 和一个有参的构造函数,以便在实例化对象时,可以设置对象的名字;并使 shout()方法可以根据 name 的值输出对象的名字,如“我的名字叫…,喵”,同时实现默认构造函数。
3.修改以上程序, 自行设计一个有参构造函数并调用。
class Cat { private final String name; public Cat(String name) { this.name = name; cnt++; } public void shout() { System.out.println("My name is" + name + " Meow Meow Meow"); } }
4.修改以上程序,利用私有字段和 get/set 方法实现能够控制猫的叫声的功能,让它叫几声,它就叫几声,并且能够输出叫声,但是最多叫 10 声。
5.修改以上程序,设计一个静态变量和静态方法统计并显示生成的实例个数。
class Cat { static int cnt=0; private int n; private final String name; public Cat(String name) { this.name = name; cnt++; } public void shout() {//猫叫方法 System.out.println("My name is" + name); for (int i = 0; i < Math.min(n,10); i++) { System.out.print("Meow "); } } public void setN(int n) {//设置猫的叫声数量 this.n = n; } public int getCnt() {//返回实例个数 return cnt; } }
6.在上一堂课实现的程序基础上,仿照 Cat 类增加一个 Dog 类,也有 shout()方法,能够输出“我的名字叫…. 汪!汪!”等功能。
class Dog { static int cnt=0; private int n; private final String name; public Dog(String name) { this.name = name; cnt++; } public void shout() {//狗叫方法 System.out.println("My name is" + name); for (int i = 0; i < Math.min(n,10); i++) { System.out.print("Woof "); } } public void setN(int n) {//设置狗的叫声数量 this.n = n; } public int getCnt() {//返回实例个数 return cnt; } }
7.分析 Cat 和 Dog 类的程序,可以发现它们有非常相似的代码。请建立一个父类 Animal 类,把Cat 和 Dog 相同的代码尽量放到 Animal 类中。
8.分析以上程序,可以发现 Cat 和 Dog 类都有 shout()方法,只是叫的声音不同。请修改上述程序,为 Animal 类建立一个 shout()方法,然后让 Cat 和 Dog 去重写这个 shout()方法,实现多态。
9.在以上程序的基础上,增加牛和羊两种动物,而且都要叫出自己的声音。
class Animal { static int cnt = 0; public int n; public final String name; public Animal(String name) { this.name = name; cnt++; } public void shout(){ } public void setN(int n) {//设置狗的叫声数量 this.n = n; } public int getCnt() {//返回实例个数 return cnt; } } class Cat extends Animal { public Cat(String name) { super(name); } public void shout() { System.out.println("My name is" + name); for (int i = 0; i < Math.min(n, 10); i++) { System.out.print("Meow "); } } } class Dog extends Animal { public Dog(String name) { super(name); } public void shout() { System.out.println("My name is" + name); for (int i = 0; i < Math.min(n, 10); i++) { System.out.print("Woof "); } } } class Cow extends Animal { public Cow(String name) { super(name); } public void shout() { System.out.println("My name is" + name); for (int i = 0; i < Math.min(n, 10); i++) { System.out.print("Mou "); } } } class Goat extends Animal { public Goat(String name) { super(name); } public void shout() { System.out.println("My name is" + name); for (int i = 0; i < Math.min(n, 10); i++) { System.out.print("Mie"); } } }
10.分析以上程序,可以发现四种动物的 shout()方法中,除了动物叫的声音不同外,几乎是相同的。请把该方法在 Animal 类中实现,但是由于各种动物的叫声不同,需要增加一个方法 getSound(),在子类中获得各种动物的叫声。经过重构,所有的重复都放到父类中,子类变得非常简洁,而且容易修改。
11.由于 Animal 类根本不可能实例化也不需要实例化,所以可以把实例化没有任何意义的父类改成抽象类。请在以上程序的基础上,将 Animal 类改为抽象类,同时 getSound()也应改为抽象方法。
abstract class Animal { static int cnt = 0; public int n; public final String name; public String Sound; public Animal(String name) { this.name = name; cnt++; } public void shout(){ for (int i = 0; i < Math.min(n, 10); i++) { System.out.print(Sound+' '); } } abstract public void getSound(); public void setN(int n) {//设置动物的叫声数量 this.n = n; } public int getCnt() {//返回实例个数 return cnt; } } class Cat extends Animal { public Cat(String name) { super(name); } public void getSound(){ Sound="Meow"; } } class Dog extends Animal { public Dog(String name) { super(name); } public void getSound(){ Sound="Woof"; } } class Cow extends Animal { public Cow(String name) { super(name); } public void getSound(){ Sound="Mou"; } } class Goat extends Animal { public Goat(String name) { super(name); } public void getSound(){ Sound="Mie"; } }
11.在四种动物中,Cat 和 Dog 能捉老鼠,请将这个功能设计成接口,并分别由 Cat 和 Dog 两种动物继承实现。
interface CatchMouse{ public void Catch(); } abstract class Animal{ static int cnt = 0; public int n; public final String name; public String Sound; public Animal(String name) { this.name = name; cnt++; } public void shout(){ for (int i = 0; i < Math.min(n, 10); i++) { System.out.print(Sound+' '); } } abstract public void getSound(); public void setN(int n) {//设置狗的叫声数量 this.n = n; } public int getCnt() {//返回实例个数 return cnt; } } class Cat extends Animal implements CatchMouse{ public Cat(String name) { super(name); } public void getSound(){ Sound="Meow"; } public void Catch(){ System.out.println(name+"as a cat caught a mouse"); } } class Dog extends Animal implements CatchMouse{ public Dog(String name) { super(name); } public void getSound(){ Sound="Woof"; } public void Catch(){ System.out.println(name+"as a dog caught a mouse"); } } class Cow extends Animal { public Cow(String name) { super(name); } public void getSound(){ Sound="Mou"; } } class Goat extends Animal { public Goat(String name) { super(name); } public void getSound(){ Sound="Mie"; } }