Animal抽象类有2个抽象方法cry()和getAnimaName(),即要求各种具体的动物给出自己的叫声和种类名称。
? 编写模拟器类Simulator
该类有一个playSound(Animal animal)方法,该方法的参数是Animal类型。即参数animal可以调用Animal的子类重写的cry()方法播放具体动物的声音、调用子类重写的getAnimalName()方法显示动物种类的名称。
? 编写Animal类的子类:Dog,Cat类
图5.18是Simulator、Animal、Dog、Cat的UML图。 Animal Simulator
cry():void playSound(Animal):void getAnimalName():String
Dog Cat
cry():void e cry():void
图5.18 UML类图
? 编写主类Application(用户程序)
在主类Application的main方法中至少包含如下代码:
Simulator simulator = new Simulator(); simulator.playSound(new Dog()); simulator.playSound(new Cat());
Animal.java
public abstract class Animal { public abstract void cry();
public abstract String getAnimalName(); }
Simulator.java
public class Simulator {
public void playSound(Animal animal) {
System.out.print(\现在播放\类的声音:\ animal.cry(); } }
Dog.java
public class Dog extends Animal { public void cry() {
System.out.println(\汪汪...汪汪\ }
public String getAnimalName() { return \狗\ } }
Cat.java
public class Cat extends Animal { public void cry() {
System.out.println(\喵喵...喵喵\ }
public String getAnimalName() { return \猫\ } }
Application.java
public class Example5_13 {
public static void main(String args[]) { Simulator simulator = new Simulator(); simulator.playSound(new Dog()); simulator.playSound(new Cat()); } }
习题6(第6章)
一、问答题
1.接口中能声明变量吗?
2.接口中能定义非抽象方法吗? 3.什么叫接口的回调?
4.接口中的常量可以不指定初值吗?
5.可以在接口中只声明常量,不声明抽象方法吗?
1.不能。 2.不能。
3.可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。 4.不可以。 5.可以。 二、选择题
1.下列哪个叙述是正确的 d
A.一个类最多可以实现两个接口。
B.如果一个抽象类实现某个接口,那么它必须要重写接口中的全部方法。 C.如果一个非抽象类实现某个接口,那么它可以只重写接口中的部分方法。 D.允许接口中只有一个抽象方法。
非抽象类实现接口必须要重写接口中的全部方法,否则要把该类设置为抽象类,换句话说抽象类实现一个接口是可以不用重写接口中的全部方法的。 2.下列接口中标注的(A,B,C,D)中,哪两个是错误的?ab
interface Takecare {
protected void speakHello(); //A public abstract static void cry(); //B int f(); //C abstract float g(); //D }
A中抽象方法的访问修饰符只能用public。 B中abstract和static不能共存。
3.将下列(A,B,C,D)哪个代码替换下列程序中的【代码】不会导致编译错误。a
A.public int f(){return 100+M;} B.int f(){return 100;}
C.public double f(){return 2.6;}。 D.public abstract int f(); interface Com { int M = 200; int f(); }
class ImpCom implements Com { 【代码】 }
接口中的抽象方法默认是public类,那么类在重写接口方法时不仅要去掉abstract
修饰符,给出方法体,而且方法的访问权限一定要明显地用public来修饰(不能降低访问权限)。
C选项改变了返回值类型,不属于方法重写
1.D。2.AB。3.B。 三、阅读程序 1.【代码1】:15.0。【代码2】:8。
1.请说出E类中【代码1】,【代码2】的输出结果。
interface A {
double f(double x,double y); }
class B implements A {
public double f(double x,double y) { return x*y; }
int g(int a,int b) { return a+b; } }
public class E {
public static void main(String args[]) { A a = new B();
System.out.println(a.f(3,5)); //【代码1】 B b = (B)a;
System.out.println(b.g(3,5)); //【代码2】 } }
2.请说出E类中【代码1】,【代码2】的输出结果。
interface Com { int add(int a,int b); }
abstract class A {
abstract int add(int a,int b); }
class B extends A implements Com{ public int add(int a,int b) { return a+b; } }