接口的概念、接口的简单用法、接口引用、接口的多态、常量接口
10.接口
10.1 什么是接口
10.1.1 接口的语法
- 接口相当于特殊的抽象类,定义方式、组成部分与抽象类类似;
public class TestBasicInterface {
public static void main(String[] args) {
System.out.println(MyInterface.A);
System.out.println(MyInterface.B);
//MyInterface.C = "cc";//error
System.out.println(MyInterface.D);
}
}
interface MyInterface{
//公开静态常量(只能)
public static final String A = "aaa";
public final String B = "bbb";
public static String C = "ccc";
String D = "ddd";//public static final 隐式存在、修饰
//公开抽象方法
public abstract void m1();
public void m2();
abstract void m3();
void m4();//public abstract 隐式存在、修饰
}
10.1.2 与抽象类的异同
-
相同:
可编译成字节码文件;
不能创建对象;
可以作为引用类型;
具备Object类所定义的方法; -
不同:
所有属性都是公开静态常量,隐式使用public static final修饰;
所有方法都是公开抽象方法,隐式使用public abstract修饰;
没有构造方法、动态代码块、静态代码块;
10.1.3 接口的微观概念
-
微观概念:接口是一种能力和约束;
-
接口的定义:代表了某种能力;
-
方法的定义:能力的具体要求;
-
经验:Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力;
-
接口支持多实现,可为类扩充多种能力;
10.1.4 接口的规范
- 任何类在实现接口时,必须实现接口中的所有的抽象方法,否则此类为抽象类;
- 实现接口中的抽象方法时,访问修饰符必须是public;
10.1.5 接口引用
- 同父类一样,接口也可以声明为引用,并指向实现类对象;
- 注意:
仅可调用接口中所声明的方法,不可调用实现类中独有的方法;
可强转回实现类本身类型,进行独有方法调用;
public class TestApplyInterface {
public static void main(String[] args) {
Animal a = new Dog();//父类方法引用子类对象
Runnable d = new Dog();//接口引用子类对象
d.run();
if(d instanceof Dog) {//可强转回实现类本身类型
Dog dog = (Dog)d;
dog.swim();
}
}
}
class Animal{
String breed;
int age;
String sex;
public void eat() {}
public void sleep() {}
}
class Dog extends Animal implements Runnable , Swimmable{//实现接口->代码落地
String furColor;
public void run() {
System.out.println("狗在奔跑。。。");
}
@Override
public void swim() {
System.out.println("狗在游泳。。。");
}
}
class Cat extends Animal implements Runnable , Climbable{
String furColor;
public void run() {
System.out.println("猫在跑。。。");
}
public void climb() {
System.out.println("猫在爬树。。。");
}
}
class Fish extends Animal implements Swimmable{
public void swim() {
System.out.println("鱼在游。。。");
}
}
class Bird extends Animal implements Flyable{
public void fly() {
System.out.println("鸟在飞翔。。。");
}
}
//定义了一种能力:会跑的
interface Runnable{
public abstract void run();
}
//定义了一种能力:会游的
interface Swimmable{
public abstract void swim();
}
//定义了一种能力:会爬的
interface Climbable{
void climb();
}
//定义了一种能力:会飞的
interface Flyable{
void fly();
}
10.2 接口的多态
10.2.1 接口多态的概念
public class TestPolymorpfic{
public static void main(String[] args){
Dog myDog = new Dog();//将狗当狗看
Animal a = myDog;//将狗当动物看
Runnable = myDog;//将狗当会跑的东西看
Swimmable = myDog;//将狗当会游的东西看
}
}
interface Runnable{
void run();
}
interface Swimmable{
void swim();
}
abstract class Animal{
public void eat(){}
public void sleep(){}
}
class Dog extends Animal implements Runnable , Swimmable{
public void run(){}//接口方法
public void swim(){}//接口方法
public void shout(){}
}
- 多种不同类型的引用指向同一个对象时,表示看待对象的视角不同;
- 不同引用所能看到的对象范围不同,只能调用自身类型中所声明的部分;
10.2.2 常见关系
-
类与类:
单继承
extends 父类名称 -
类与接口:
多实现;
implements 接口名称1 , 接口名称2 , 接口名称n -
接口与接口:
多继承;
extends 父接口1 , 父接口2 , 父接口n
10.2.3 常量接口
- 将多个常用于表示状态或固定值的变量,以静态常量的形式定义在接口中统一管理,提高代码可读性;