阅读量:6
前言
本篇会讲到Java中接口内容,概念和注意点可能比较多,需要耐心多看几遍,我尽可能的使用经典的例子帮助大家理解~
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
接口
接口是公共的行为规范标准,在Java中,接口是多个类的公共规范,是一种引用数据类型。
语法
- 定义格式与类基本相同,将class关键字换成interface关键字
- 接口中的成员变量(习惯上是大写)默认为public static final 修饰的(写的时候可省略public static final),必须被初始化
- 接口中的方法默认只能是public abstract 修饰的(也可省略不写,不写默认也是抽象方法(不能有具体的实现,否则会报错),用其他修饰符会报错)
- 接口中使用default修饰的方法和static修饰的方法是可以有具体的实现的
- 接口中不能有静态代码块、示例代码块和构造方法。
- 接口虽然不是类,但编译完成后也是字节码文件(后缀名是.class)。
注意
- 创建接口时, 接口的命名一般以大写字母 I 开头
- 接口的命名一般使用 "形容词" 词性的单词.
- 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性.
代码理解
package demo2inter; public interface ITestInterFace { public static final int a=100; int AGE=10; abstract public void fun1(); void fun2(); default void func(){ System.out.println("default!"); } public static void staticFunc(){ System.out.println("staticFunc!"); } }
接口的简单使用
- 接口不能被实例化
- 接口需要被类实现,需要使用关键字implements来实现
- 当一个类实现类这个接口,那么这个类要重写这个方法
- 接口也可以发生向上转型、动态绑定和多态。
public interface ITestInterFace { void draw(); } class Rect implements ITestInterFace{ @Override public void draw() { System.out.println("画一个矩形!"); } } class Triangle implements ITestInterFace{ @Override public void draw() { System.out.println("画一个三角形!"); } } class Test{ public static void drawMap(ITestInterFace iTestInterFace){ iTestInterFace.draw(); } public static void main(String[] args) { drawMap(new Rect());//发生了向上转型和动态绑定 drawMap(new Triangle()); } }
接口运用举例
请实现笔记本电脑使用USB鼠标、USB键盘的例子
- USB接口:包含打开设备、关闭设备功能
- 笔记本类:包含开机功能、关机功能、使用USB设备功能
- 鼠标类:实现USB接口,并具备点击功能
- 键盘类:实现USB接口,并具备输入功能
在包demo3中,创建3个类,一个接口
IUSB接口
package demo3; public interface IUSB { // USB接口 void openDevice();//打开服务 void closeDevice();//关闭服务 }
KeyBoard类
package demo3; public class KeyBoard implements IUSB { @Override public void openDevice() { System.out.println("打开键盘!"); } @Override public void closeDevice() { System.out.println("关闭键盘!"); } public void input(){ System.out.println("键盘输入!"); } }
Mouse类
package demo3; public class Mouse implements IUSB{ @Override public void openDevice() { System.out.println("打开鼠标!"); } @Override public void closeDevice() { System.out.println("关闭鼠标!"); } public void click(){ System.out.println("点击鼠标!"); } }
Computer类
package demo3; import demo2inter.ITestInterFace; public class Computer { public void powerOff (){ System.out.println("关闭电脑!"); } public void powerOn(){ System.out.println("打开电脑!"); } public void useDevice(IUSB usb){ usb.openDevice(); //这里要区分 USB引用了哪个对象 if(usb instanceof Mouse){ Mouse mouse =(Mouse) usb;//向下转型 mouse.click(); } //调用键盘 if(usb instanceof KeyBoard){ KeyBoard keyBoard=(KeyBoard) usb; keyBoard.input(); } usb.closeDevice(); } public static void main(String[] args) { Computer computer=new Computer(); computer.powerOn(); computer.useDevice(new KeyBoard());//向上转型 computer.useDevice(new Mouse()); computer.powerOff(); } }
多个接口
Java中不支持多继承,但是一个类可以实现多个接 口。接口表达含义是 具有**特性,可以帮助程序员忘掉类型,只关注特性。
代码理解(语法层面)
类TestDemo4实现了IA和IB接口
package demo4; //多个接口 interface IA{ void testA(); } interface IB{ void testB(); } class TestDemo4 implements IA,IB{ @Override public void testA() { System.out.println("testA()"); } @Override public void testB() { System.out.println("testB()"); } } public class Test4 { public static void main(String[] args) { TestDemo4 testDemo4=new TestDemo4(); testDemo4.testA(); testDemo4.testB(); } }
接口解决多继承问题 代码示例
在demomoreinher包中有Animal抽象类,Duck,Fish类 以及IFly、IRunning、ISwimming接口
Animal类
IFly、IRunning、ISwimming等动物特性应该采用接口方式
package demomoreinher; public abstract class Animal { protected String name; protected int age; public Animal(String name, int age) { this.name = name; this.age = age; } public abstract void eat(); //像跑 游泳 飞等动作不能写在这里,因为不是所有动物都会这些技能 应该写在接口中 }
IFly、IRunning、ISwimming接口
//注意:这里的代码是在不同IFly、IRunning、ISwimming接口文件中的 public interface IFly { void fly(); } public interface IRunning { void run(); } public interface ISwimming { void swim(); }
Fish类
鱼只会游泳这项特性,所以接口ISwimming
package demomoreinher; public class Fish extends Animal implements ISwimming{//如果这里游泳写出类,java是不支持多继承的,所有说接口解决了多继承问题 public Fish(String name, int age) { super(name, age); } @Override public void eat() { System.out.println(this.name+"吃鱼粮!"); } @Override public void swim() { System.out.println(this.name+"游泳~"); } }
Duck类
而鸭子游泳,跑,飞这3个技能都会,所以三个特性都接上
package demomoreinher; public class Duck extends Animal implements ISwimming,IFly,IRunning{ public Duck(String name, int age) { super(name, age); } @Override public void eat() { System.out.println(this.name+"吃鸭粮!"); } @Override public void fly() { System.out.println(this.name+"飞~~~"); } @Override public void run() { System.out.println(this.name+"跑~~~"); } @Override public void swim() { System.out.println(this.name+"游泳~~~"); } }
再加上一个测试
package demomoreinher; public class TestAnimal { public static void eatFunc(Animal animal){ animal.eat();//实现eat的动态绑定 } public static void walk(IRunning running){ running.run();//实现跑的动态绑定 } public static void main(String[] args) { walk(new Duck("唐老鸭",3)); eatFunc(new Fish("灵儿",2)); } }
测试结果
接口间的继承
相当于将接口合并在一起了
代码理解
IC继承了IA和IB,使IC接口的功能包含了IA和IB的功能,当然类TestDeme在实现接口IC时,要将IA,IB和IC的方法一起都要重写
package demo5; //接口继承问题 interface IA{ void testA(); } interface IB{ void testB(); } //IC接口不仅具备了自己的testC这个功能,还 扩展 了IA和IB的功能 interface IC extends IA,IB{ void testC(); } class TestDemo implements IC{ @Override public void testA() { System.out.println("testA()"); } @Override public void testB() { System.out.println("testB()"); } @Override public void testC() { System.out.println("testC()"); } }