Java 基础 ----- 接口
关键字:interface implements
1、接口:提供一种约定,使其实现接口的类(或结构)在形式上保持一致。
接口可以看做是一种特殊的抽象类,这个抽象类的中的所有方法都是抽象方法,但是与抽象类的语法不通,设计理念也不同。
属于引用类型变量
语法:
public interface 接口名{ //接口成员 }
注意:
a、接口不能实例化
b、和抽象类不同,接口使用interface 修饰,访问修饰符只能事public,且可选
c、接口成员可以是全局常量和公共的抽象方法。
实现接口 implements:
public 类名 implements 接口名{ 实现方法 普通方法 }
注意:
a、使用接口借助子类,使用implements关键字实现
b、实现接口类必须实现接口中定义的所有的抽象方法
c、接口的实现类允许包含普通方法
2、创建接口
例子:
//接口 package com.obge.ex; public interface UsbInterface { void service(); void service2(); } //实现 1个接口 package com.obge.ex; public class ShuUsb implements UsbInterface { @Override public void service() { // TODO Auto-generated method stub System.out.println("鼠标连接"); } @Override public void service2() { // TODO Auto-generated method stub } } //实现两个接口 package com.obge.ex; public class UsbIsk implements UsbInterface,UsbInterface2{ @Override public void service() { // TODO Auto-generated method stub System.out.println("传输数据"); } @Override public void service2() { // TODO Auto-generated method stub } @Override public void test1() { // TODO Auto-generated method stub } }
调用:
类只能继承一个父类,但可以实现多个接口,通过实现多个接口达到多继承的效果。
接口表示一种约定,也表示一种能力,体现了约定和实现相分离的原则,通过面向接口编程,可以降低代码之间的耦合性,提高代码的可扩展性和可维护性。
3、更复杂的接口
接口本身也可以继承接口。一个普通对类只能继承一个父类,但能同时实现多个接口,也可以同时继承抽象类和实现接口
语法:
访问修饰符 interface 接口名 extends 父接口1,父接口2,····{ 常量定义 方法定义 }
实现多个接口语法格式
访问修饰符 class 类名 extends 父类名 implements 接口1,接口2,·····{ 类的成员 }
注意:
A、接口和类、抽象类是一个层次上的概念,命名规则相同,属于引用类型变量
B、修饰符如果是public 在整个项目中都可见,若省略只在当前包中可见
C、接口中可以定义常量不能定义变量,接口中的属性都默认使用public static final 修饰,即接口中的属性全都是全局静态常量。接口中的常量在定义时必须指定初始值。
public static final double PI = 3.14 与 double PI = 3.14; 效果相同
D、接口中所有的方法都是抽象方法,接口中的方法默认为public
E、和抽象类一样,接口不能实例化,不能有构造方法
F、接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但不能继承类
G、类只能继承一个父类,但可以通过implements 实现多个接口,一个类必须实现接口的全部方法,否则必须定义为抽象类。若一个类在继承父类的同时又实现了多个接口,extends必须位于implements之前。
综合:
//定义鸟叫接口 public interface ShoutAbility{ //鸟叫的抽象方法 public void shout(); } //定义类 描述鸟叫的不同方式 public class AoShout implements ShoutAbility{ public void shout(){ syso("嗷嗷叫,,,,,"); } } public class ZhaShout implements ShoutAbility{ public void shout(){ syso("渣渣叫,,,,,"); } } //在鸟的抽象类中将接口作为属性,通过属性调用接口的方法 public abstract class Bird{ //鸟叫的方式 ShoutAbility shoutAbility; //鸟的有参构造,初始化鸟叫 public Bird( ShoutAbility shoutAbility){ this.shoutAbility = shoutAbility; } //叫 public void shout(){ //调用接口方法 shoutAbility.shout(); } //飞 public void fly(){ syso("弹飞***"); } //攻击 public abstract void attack(); } //炸弹鸟 public BombBrid extends Bird{ //子类有参构造 public BombBrid( ShoutAbility shoutAbility){ super(shoutAbility); } //重写攻击方法 public void attack(){ syso("炸弹攻击"); } } //分裂鸟 public SplitBrid extends Bird{ //子类有参构造 public SplitBrid ( ShoutAbility shoutAbility){ super(shoutAbility); } //重写攻击方法 public void attack(){ syso("分裂攻击"); } } //测试 main{ //嗷嗷叫 ShoutAbility ao_shout = new AoShout(); //喳喳叫 ShoutAbility zha_shout = new ZhaShout(); //炸弹鸟渣渣叫 Brid bomb = new BombBrid(zha_shout); //分裂鸟嗷嗷叫 Brid split = new SplitBrid(ao_shout); bomb.shout(); split.shout(); }
面向对象设计原则:
1、摘取代码中变化的行为,形成接口
2、多用组合,少用继承
3、针对接口编程,不依赖于具体实现
如果对一个类型有依赖,尽量依赖接口,少依赖子类,因为子类一旦发生变化,代码变动的可能性大,而接口稳定的多。在具体的代码实现中,体现在方法参数,返回值,属性类型尽量使用接口。
4、需求改变,应添加一个新的接口或类,不要修改原来的代码。