一个类可以实现多个接口,这是Java为单继承灵活性不足所做的补充。
一个类实现一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是重写这些抽象方法);否则,该类将保留从父接口那里继承到的抽象方法,该类也必须定义成抽象类。
2代码
interface Output { // 接口里定义的成员变量只能是常量 int MAX_CACHE_LINE = 50; // 接口里定义的普通方法只能是public的抽象方法 void out(); void getData( String msg ); // 接口中定义默认方法,需要使用default修饰 default void print( String... msgs ) { for (String msg : msgs) { System.out.println(msg); } } // 接口中定义默认方法,需要使用default修饰 default void test() { System.out.println("默认的test()方法"); } // 接口中定义类方法、需要使用static修饰 static String staticTest() { return "Class method"; } } // 定义一个Product接口 interface Product { int getProduceTime(); } // 让Printer类实现Output和Product接口 public class Printer implements Output , Product { private String[] printData = new String[MAX_CACHE_LINE]; // 用以记录当前需打印的作业数 private int dataNum = 0; public void out() { // 只要还有作业,继续打印 while(dataNum > 0) { System.out.println("打印机打印:" + printData[0]); // 把作业队列整体前移一位,并将剩下的作业数减1 System.arraycopy(printData , 1 , printData, 0, --dataNum); } } public void getData(String msg) { if (dataNum >= MAX_CACHE_LINE) { System.out.println("输出队列已满,添加失败"); } else { // 把打印数据添加到队列里,已保存数据的数量加1。 printData[dataNum++] = msg; } } public int getProduceTime() { return 45; } public static void main(String[] args) { // 创建一个Printer对象,当成Output使用 Output o = new Printer(); o.getData("轻量级Java EE企业应用实战"); o.getData("疯狂Java讲义"); o.out(); o.getData("疯狂Android讲义"); o.getData("疯狂Ajax讲义"); o.out(); // 调用Output接口中定义的默认方法 o.print("孙悟空" , "猪八戒" , "白骨精"); o.test(); // 创建一个Printer对象,当成Product使用 Product p = new Printer(); System.out.println(p.getProduceTime()); // 所有接口类型的引用变量都可直接赋给Object类型的变量 Object obj = p; } }
3 运行
打印机打印:轻量级Java EE企业应用实战 打印机打印:疯狂Java讲义 打印机打印:疯狂Android讲义 打印机打印:疯狂Ajax讲义 孙悟空 猪八戒 白骨精 默认的test()方法 45
4说明
Printer实现了 Output接口和 Product接口,因此Pinter对象即可以直接赋给Output变量,也可直接赋给Product变量。仿佛Printer类既是Output类的子类,也是Product类的子类,这就是Java提供的模拟多继承。
Printer实现了Output接口,即可获取Output接口中定义的print()方法和test()两个默认方法,因此Printer实例可以直接调用这两个默认方法。
接口不能显示继承任何类,但所有接口类型的引用变量都可以直接赋给Object类型的引用变量。
先继承抽象类在实现接口 class C extends B implements A interface A{	public abstract void say(); } abstract class B{	public abstract void fun(); } class C extends B implements A{	public void say() ...
先继承抽象类在实现接口
先写extends,后写implements
interfaceA{publicabstractvoidsay();}abstractclassB{publicabstractvoidfun();}classCextendsBimplementsA{publicvoidsay(){ System.out.println("Hello!");}publicvoidfun(){ System.out.println("GO!");}}publicclassText{publicstaticvoidmain(String[] args){ C c=newC(); c.say(); c.fun();}}

题目

大一下Java期末考
Description
请你使用面向对象的概念表示出下面的一所公司:
去西餐餐馆吃一顿饭,一般情况下,菜的次序分为前菜、主食、饭后甜点
菜单接口Menu,该接口有两个方法,获取顾客的点餐记录getOrderList(),获取顾客消费的总价钱getTotalValue()。
抽象菜的次序类Dishes,包含了名字name,该次序中的点菜记录orderList,点中该次序点菜的总价totalValue,抽象方法获取该次序点菜的详细信息的方法getDisMessage()。
抽象菜类Course,包含了菜的名字name,菜的价格price,菜的次序,以及getter和setter方法,一个抽象方法获取员工信息的方法getCourseMessage()。
请你写三个类继承菜的次序类来表述前菜、主食、饭后甜点,写一个类实现菜单接口,写一个类来继承菜类,并使用菜单接口Menu,输出点餐记录,费用总和。
Input
只有一组案例,先输入一个数字n表示点菜的数量,接下来的有n行数据,每行表示一个菜的信息,一共有3个数据分别表示:菜名、菜的次序、菜的价格。
Ouput
输出点餐记录,费用总和。