接口(上篇)
接口(上篇)
- 1.概念
- 2.语法规则
- 3.使用和特性
- 4.实现多接口
- 5.接口间继承
1.概念
接口就是公共的行为规范标准,大家在实现时,
只要符合规范标准,就可以通用。
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型
2.语法规则
接口的定义格式与定义类的格式基本相同,
将class关键字换成 interface 关键字,就定义了一个接口
3.使用和特性
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,
实现接口中的所有抽象方法
- 接口类型是一种引用类型,但是不能直接new接口的对象
- 接口中每一个方法都是public的抽象方法,
即接口中的方法会被隐式的指定为 public abstract - 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
- 重写接口中方法时,不能使用默认的访问权限
- 接口中可以含有变量,
但是接口中的变量会被隐式的指定为 public static final 变量 - 接口中不能有静态代码块和构造方法
- 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
- 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
- jdk8中:接口中还可以包含default方法
public class Computer {public void powerOn() {System.out.println("打开电脑...");}public void powerOff() {System.out.println("关闭电脑.....");}public void useDevice(IUSB iusb) {iusb.openDevice();if(iusb instanceof KeyBoard ) {KeyBoard keyBoard = (KeyBoard)iusb;keyBoard.input();}if(iusb instanceof Mouse) {Mouse mouse = (Mouse)iusb;mouse.click();}iusb.closeDevice();}
}
public interface IUSB {void openDevice();void closeDevice();//public abstract
}
public class KeyBoard implements IUSB{@Overridepublic void openDevice() {System.out.println("打开键盘服务....");}public void input() {System.out.println("键盘输入数据.....");}@Overridepublic void closeDevice() {System.out.println("关闭键盘服务....");}
}
public abstract class MicroPhone implements IUSB{public abstract void test();
}class ITest extends MicroPhone {@Overridepublic void openDevice() {}@Overridepublic void closeDevice() {}@Overridepublic void test() {}
}
public class Mouse implements IUSB{@Overridepublic void openDevice() {System.out.println("打开鼠标服务...");}public void click() {System.out.println("点击鼠标.....");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标服务...");}
}
public class Test {public static void main(String[] args) {Computer computer = new Computer();computer.powerOn();computer.useDevice(new KeyBoard());computer.useDevice(new Mouse());computer.powerOff();}}
4.实现多接口
在Java中,类和类之间是单继承的,一个类只能有一个父类,
即Java中不支持多继承,但是一个类可以实现多个接口
public abstract class Animal {public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public abstract void eat();//如果把 跑 游泳 飞 这些功能写到这里面 可以不可以 1:可以 2:不可以 -》 2// 不是所有的动物 都具备 这些功能
}
public class Bird extends Animal implements IFlyable{public Bird(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+" 正在吃鸟粮....");}@Overridepublic void fly() {System.out.println(this.name+" 正在飞....");}
}
public class Dog extends Animal implements ISwimmable,IRunable {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+" 正在吃狗粮.....");}@Overridepublic void run() {System.out.println(this.name+" 正在跑...");}@Overridepublic void swim() {System.out.println(this.name+" 正在游泳...");}}
public class Duck extends Animal implements IFlyable,IRunable,ISwimmable{public Duck(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name+" 正在鸭粮....");}@Overridepublic void fly() {System.out.println(this.name+" 正在飞....");}@Overridepublic void run() {System.out.println(this.name+" 正在跑....");}@Overridepublic void swim() {System.out.println(this.name+" 正在游泳....");}
}
public interface IFlyable {void fly();
}
public interface IRunable {void run();
}
public interface ISwimmable {void swim();
}
public class Robot implements IRunable{@Overridepublic void run() {System.out.println("机器人在跑.....");}
}
public class TestDemo {public static void walk(IRunable runable) {runable.run();}public static void swim(ISwimmable iSwimmable) {iSwimmable.swim();}public static void fly(IFlyable iFlyable) {iFlyable.fly();}public static void main(String[] args) {Bird bird = new Bird("小鸟·",3);Dog dog = new Dog("小狗",13);Duck duck = new Duck("小鸭",5);Robot robot = new Robot();walk(duck);walk(dog);walk(robot);System.out.println("=====");swim(duck);swim(dog);System.out.println("====");fly(duck);fly(bird);}public static void eatFun(Animal animal) {animal.eat();}}
5.接口间继承
在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承
interface A {void testA();
}
interface B {void testB();
}
//extends 拓展
interface C extends A,B {void testC();
}public class TestDemo2 implements C{@Overridepublic void testA() {}@Overridepublic void testB() {}@Overridepublic void testC() {}
}