前言
本篇会讲到Java中接口内容,概念和注意点可能比较多,需要耐心多看几遍,我尽可能的使用经典的例子帮助大家理解~
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
前言
接口
语法
注意
代码理解
接口运用举例
IUSB接口
KeyBoard类
Mouse类
Computer类
多个接口
代码理解(语法层面)
接口解决多继承问题 代码示例
Animal类
IFly、IRunning、ISwimming接口
Fish类
Duck类
再加上一个测试
接口间的继承
代码理解
接口
接口是公共的行为规范标准,在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()"); }}