苏州网站的优化,云服务器拿来做网站,网站建设课程任务,用scala做的网站面向对象高级#xff08;5#xff09; 接口
接口就是规范#xff0c;定义的是一组规则#xff0c;体现了现实世界中“如果是...则必须能...”的思想。继承是一个是不是的is-a关系#xff0c;而接口实现则是 能不能的has-a关系。
1、接口的定义格…面向对象高级5 接口
接口就是规范定义的是一组规则体现了现实世界中“如果是...则必须能...”的思想。继承是一个是不是的is-a关系而接口实现则是 能不能的has-a关系。
1、接口的定义格式
接口的定义它与定义类方式相似但是使用 interface 关键字。它也会被编译成.class文件但一定要明确它并不是类而是另外一种引用数据类型。
引用数据类型数组类枚举接口注解。
修饰符 interface 接口名{ //接口的成员列表
//默认方法
default 返回值类型 方法名{
} // 公共的静态常量
public static final 数据类型 变量名//提示前置修饰中public static final可以省略 // 公共的抽象方法public abstract可省略
public abstract 返回值 方法名{
} // 公共的默认方法JDK1.8以上 // 公共的静态方法JDK1.8以上 // 私有方法JDK1.9以上}
不能声明构造器、代码块。 2、接口的实现
1类实现接口implements
接口不能创建对象但是可以被类实现implements 类似于被继承。
类与接口的关系为实现关系即类实现接口。实现了接口的类称为实现类。实现的动作类似继承格式相仿只是关键字不同实现使用 implements关键字。 修饰符 class 实现类的类名 implements 接口{// 必须重写接口中的抽象方法如果实现类是抽象类那么可以不重写 // 可以重写接口中的默认方法} 修饰符 class 实现类 extends 父类 implements 接口{//必须重写所有的抽象方法}
注意
如果接口的实现类是非抽象类那么必须重写接口中所有抽象方法。默认方法可以选择保留也可以重写。default不能省略。重写时default单词就不要再写了它只用于在接口中表示默认方法到实现类中就没有默认方法的概念了接口中的静态方法不能被继承也不能被重写static不能省略
public interface Ipower { void power();//抽象方法 default void brand(){ System.out.println(famous.); }//默认方法
} public class IpowerTest implements Ipower{//实现接口 public void power(){ System.out.println(Charge.); }//重写抽象方法 public static void main(String[] args){ IpowerTest t new IpowerTest();//创建实例对象 t.power();//调用重写后的抽象方法 }
} 2接口的多实现
对于接口而言一个类是可以实现多个接口的这叫做接口的多实现。并且一个类能继承一个父类同时实现多个接口。
实现格式
1.修饰符 class 实现类 implements 接口1接口2接口3。。。{// 重写接口中所有抽象方法【必须】当然如果实现类是抽象类那么可以不重写 // 重写接口中默认方法【可选】}2.修饰符 class 实现类 extends 父类 implements 接口1接口2接口3。。。{ // 重写接口中所有抽象方法【必须】包括父类中的抽象方法与接口中的抽象方法除非子类也声明为声明为抽象类才可以不重写。 // 重写接口中默认方法【可选】}
接口中有多个抽象方法时实现类必须重写所有抽象方法。如果抽象方法有重名的只需要重写一次。
定义多个接口
public interface A { void showA();}public interface B { void showB();}
定义实现类
public class C implements A,B { Override public void showA() { System.out.println(showA); } Override public void showB() { System.out.println(showB); }}
定义测试类
public class TestC { public static void main(String[] args) { C c new C(); c.showA(); c.showB(); }} 3接口的多继承
一个接口能继承另一个或者多个接口接口的继承也使用 extends 关键字子接口继承父接口的方法。
子接口的实现类需要将接口中所有的抽象方法都进行重写重名的抽象方法只需要重写一次。
定义父类接口
public interface Chargeable { void charge();}
定义子类接口
public interface UsbC extends Chargeable,USB3 { void reverse();}
定义子接口的实现类
public class TypeCConverter implements UsbC { Override public void reverse() { System.out.println(正反面都支持); } Override public void charge() { System.out.println(可充电); }}
4接口与实现类对象构成多态引用
实现类 实现接口类似于子类继承父类因此接口类型的变量与实现类的对象之间也可以构成多态引用。通过接口类型的变量调用方法最终执行的是new的实现类对象实现的方法体。
接口名 变量名 new 实现类对象
public class USBTest { public static void main(String[] args) { Computer c new Computer(); Printer p new Printer(); c.transferData(p);//USB usb new Printer();实际执行打印机重写后的方法。 }}interface USB{ void start(); void end();}class Computer { public void transferData(USB usb){ System.out.println(Successfully connect.); usb.start(); System.out.println(Transferring date...); usb.end(); }}//通过引用实例变量usb实现USB接口的调用class Printer implements USB{ Override public void start() { System.out.println(beginning work); } Override public void end() { System.out.println(end work); }} 此处展示有关匿名对象与匿名实现类的书写
public class USBTest { public static void main(String[] args) { Computer c new Computer(); Printer p new Printer(); c.transferData(p);//USB usb new Print();实际执行打印机重写后的方法。 System.out.println(); c.transferData(new Printer());//创建实现类的匿名对象 System.out.println(); USB usb new USB() { Override public void start() { System.out.println(beginning work); } Override public void end() { System.out.println(end work); } }; c.transferData(usb);//创建匿名实现类的对象 System.out.println(); c.transferData(new USB() { Override public void start() { System.out.println(beginning work); } Override public void end() { System.out.println(end work); } });//创建匿名实现类的匿名对象 }} 5使用接口的静态成员
接口不能直接创建对象但是可以通过接口名直接调用接口的静态方法和静态常量。
public class TestUSB3 { public static void main(String[] args) { //通过“接口名.”调用接口的静态方法 (JDK8.0才能开始使用) USB3.show(); //通过“接口名.”直接使用接口的静态常量 System.out.println(USB3.MAX_SPEED); }}
6、使用接口的非静态方法
接口的非静态方法也只能使用“接口名.进行调用不能通过实现类的对象进行调用
对于接口的抽象方法、默认方法只能通过实现类对象才可以调用 接口不能直接创建对象只能创建实现类的对象
public class TestMobileHDD { public static void main(String[] args) { //创建实现类对象 MobileHDD b new MobileHDD(); //通过实现类对象调用重写的抽象方法以及接口的默认方法如果实现类重写了就执行重写的默认方法如果没有重写就执行接口中的默认方法 b.start(); b.in(); b.stop(); //通过接口名调用接口的静态方法// MobileHDD.show();// b.show(); Usb3.show(); }} 补充
1类优先原则
当一个类既继承一个父类又实现若干个接口时父类中的成员方法与接口中的抽象方法重名子类就近选择执行父类的成员方法。
2接口冲突
实现类实现了多个接口而多个接口中存在同名同参的方法时编译不通过会报错。此时必须在实现类中重写同名同参的方法。
3解决接口冲突后若仍然想要调用具体的某个接口中同名同参的方法则采用 接口名.super.方法名的写法。
小结
接口本身不能创建对象只能创建接口的实现类对象接口类型的变量可以与实现类对象构成多态引用。声明接口用interface接口的成员声明有限制 1公共的静态常量2公共的抽象方法3公共的默认方法JDK8.0 及以上4公共的静态方法JDK8.0 及以上5私有方法JDK9.0 及以上类可以实现接口关键字是implements而且支持多实现。如果实现类不是抽象类就必须实现接口中所有的抽象方法。如果实现类既要继承父类又要实现父接口那么继承extends在前实现implements在后。接口可以继承接口关键字是extends而且支持多继承。接口的默认方法可以选择重写或不重写。如果有冲突问题另行处理。子类重写父接口的默认方法要去掉default子接口重写父接口的默认方法不要去掉default。接口的静态方法不能被继承也不能被重写。接口的静态方法只能通过“接口名.静态方法名”进行调用。