接口是特殊的抽象类
接口和类是完全不同的机制,接口可以多继承,类不可以
接口没有构造方法
有抽象方法 可以有常量,完整限定符public static final
特性:接口不可以被实例化;
实现类必须实现接口的所有方法;
本章作业
一、选择题
1.下面的程序中定义了一个Java接口,其中包含( C )处错误。
public interface Utility {
private int MAX_SIZE=20;//
int MIN_SIZE=10;
void use() { //
System.out.println(“using it”);
}
private int getSize();//
void setSize(int i);
}
A. 1
B. 2
C. 3
D. 4
2.给定如下Java代码,可以填入横线处的语句是(A B )。
public interface Utility { }
class FourWheeler implements Utility{ }
class Car extends FourWheeler{ }
class Bus extends FourWheeler{ }
public class Test {
public static void main(String[] args) {
_________________
}
}
A. Utility car=new Car();
B. FourWheeler bus=new Bus();
C. Utility ut=new Utility();
D. Bus bus=new FourWheeler();
3.以下关于接口的说法中,正确的是( AD )。
A.接口中全部方法都是抽象方法,所有方法必须是public访问权限
B. 接口中属性都使用pubic static final修饰,没有显式赋值将使用默认值
C.接口可以有构造方法
D.一个类只能有一个父类,但可以同时实现多个接口
4.给定下面的Java代码,可以填入下划线处的语句是( C )。
public interface Constants {
int MAX=50;
int MIN=1;
}
public class Test {
public static voi main(String[] args) {
___________
}
}
A. Constants con=new Constants();
B. Constants.MAX=100;
C. int i=Constants.MAX-Constants.MIN;
D. Constants.MIN>0;
5.给定下面的C#代码,可以填入下划线处的语句是( B )。
public interface IUtility {
_____________
}
A. int PI=3.14;
B. public void show();
C. static string comp();
D. string concat();
二、简答题
1.请说明下面的代码中存在什么问题,该如何解决?
public interface Utility { }
class Phone implements Utility {
void use() {
System.out.println(“using phone”);
}
}
public class Test {
public static void main(String[ ] args) {
Utility util=new Phone();
util.use();//问题所在,父类类型变量直接引用子类特有方法。
父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;
同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
}
}
2.阅读如下Java代码,指出其中存在的错误,并说明错误原因。
public interface Constants {
int MAX=10000;
int MIN=1;
}
public class Test {
public static void main(String[ ] args) {
Constants con=new Constants();//不能实例化的抽象类
System.out.println(con.MAX); //不能用实例化调用属性
int i=50;
if(i>Constants.MAX) { //不能用接口名调用属性
Constants.MAX=i; //全局静态常量属性不能更改
}
}
}
3.阅读如下Java代码,给出运行结果。
public interface Animal {
void shout();
}
class Dog implements Animal {
public void shout() {
System.out.println(“W W!”);
}
}
class Cat implements Animal {
public void shout() {
System.out.println(“M M!”);
}
}
class Store {
public static Animal get(String choice) {
if(choice.equalsIgnoreCase(“dog”)) {
return new Dog();
} else {
return new Cat();
}
}
}
public class AnimalTest {
public static void main(String[ ] args) {
Animal al=Store.get(“dog”);
al.shout();
}
}
输出:
W W!
——提示———————————————————————————————————
结合面向接口编程以及多态性来理解这段代码。
———————————————————————————————————————
4.在第3题基础上进行功能扩展,要求如下。
Ø 增加一种新的动物类型:Pig(猪),实现shout()方法。
Ø 修改Store类的get方法:如果传入的参数是字符串dog,则返回一个Dog对象,如果传入的参数是字符串pig,则返回一个Pig对象;否则,返回一个Cat对象。
Ø 在测试类Test中加以测试:向Store的get方法中传入参数“pig”,并在返回的对象上调用shout方法,看看与预期的结果是否一致。
——提示———————————————————————————————————
按照题目要求增加pig类、修改Store类的get方法。
———————————————————————————————————————
5.对贯穿案例电子宠物系统的类结构进行重构,要求如下。
Ø 定义Eatable接口,在接口中定义eat()方法,表示吃饭功能。
Ø 定义FlyingDiscCatchable接口,在接口中定义catchingFlyDisc()方法,表示玩飞盘
功能。
Ø 定义Swimmable接口,在接口中定义swim()方法,表示游泳功能。
Ø 定义抽象类Pet,包括宠物名称name、健康值health和主人亲密度love属性,并提供抽象方法print(),用来输出宠物信息。
Ø 定义狗类Dog,继承Pet类,实现Eatable、FlyingDiscCatchable接口,并重写或实现各个方法。
Ø 定义企鹅类Penguin和继承类Pet,实现Eatable和Swimmable接口,并重写或实现各个方法。
Ø 编写测试类,实现狗吃饭、企鹅游泳和狗玩接飞盘游戏的功能,并输出企鹅信息。
——提示———————————————————————————————————
按照题目要求依次创建相应接口、抽象类、类并进行测试,参考本章贯穿案例。
———————————————————————————————————————