接口的应用
目录
一. 接口相当于特殊的抽象类,定义方式,组成部分于抽象类类似,,没有构造方法,不能创造对象
一. 接口相当于特殊的抽象类,定义方式,组成部分于抽象类类似,,没有构造方法,不能创造对象
组成:使用Interface关键字定义接口,用implements实现接口类
只能定义:公开静态常量,公开抽象方法
package inter;
public interface MyInterface01 {
public static void main(String[] args) {
System.out.println(MyInterface01.A);
System.out.println(MyInterface01.SD);
}
//公开静态常量
public static final String A="yao";
String SD="jack";//隐式存在
//公开抽象方法
public abstract void method();
public void m2();//隐式存在
}
二.与抽象类的异同
相同:
-
可编译成字节码文件
-
不能创建对象
-
可以作为引用类型
-
具备obJect类中所定义的方法
不同
-
所有属性都是公开静态常量,隐式使用public static final修饰
-
所有方法都是公开抽象方法,隐式使用public abstract修饰
-
没有构造方法,动态代码块,静态代码块
三.什么是接口?
微观概念:接口是一种能力和定约定
-
接口的定义:代表了某种能力
-
方法的定义:能力的具体要求
经验:Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口,扩充子类能力,接口支持多实现,可为类扩展多种能力.
四:接口的规范
-
任何类实现接口时,必须实现接口中所有的抽象方法,否则为抽象类
-
接口的访问权限必须是Public
五:接口引用
-
同父类一样,接口也可声明引用,并指向实现类对象
-
接口中的多态关注行为,关注方法,不关注类型
-
只能调用接口中所声明的方法,不可调用实现类中独有方法
-
可强转回实现类本身,进行独有方法覅用
package inter;
//定义一种能力,会跑的
public interface Runnable {
public abstract void run();
}
//定义一种能力,会爬
interface Climbable {
public void climb();
}
//会飞
interface flyable{
public void fly();
}
package inter;
public class TestInterface {
public static void main(String[] args) {
Animal animal = new Dog();//父类引用指向子类对象 (父类的多态)关注类型
//接口引用指向实现类对象,只可调用接口中所声明的方法 (接口中的多态)关注行为
Runnable r = new Dog();//指向跑的方法
r.run();
}
}
class Animal implements Runnable,Climbable{
String name;
int age;
public void eat(){}
public void sleep(){}
@Override
public void run() {
System.out.println("动物行走的能力");
}
@Override
public void climb() {
System.out.println("动物爬行的能力");
}
}
class Cat extends Animal implements flyable{
String Brand;
@Override
public void fly() {
System.out.println("猫在飞");
}
}
class Fish extends Animal{
public void swin(){}
}
class Dog extends Animal{
public void run(){}
}
六:接口的多态
-
不再关注往具体的类型,而是关注行为
-
不同引用类型,仅可调用自身类型中所声明的方法
package inter;
public class TestInterface {
public static void main(String[] args) {
Dog dog = new Dog();//狗当成狗
Animal animal = new Dog();//父类引用指向子类对象 (父类的多态)关注类型,只能调父类的方法
//接口引用指向实现类对象,只可调用接口中所声明的方法 (接口中的多态)关注行为
Runnable r = new Dog();//指向跑的方法 ,将狗看成会跑的东西,只能调父类接口的方法
r.run();
flyable f =new Cat();//将猫当成会飞的东西
f.fly();
}
}
class Animal implements Runnable,Climbable{
String name;
int age;
public void eat(){}//父类的方法
public void sleep(){}//父类的方法
@Override
public void run() {//接口的方法
System.out.println("动物行走的能力");
}
@Override
public void climb() {//接口的方法
System.out.println("动物爬行的能力");
}
}
class Cat extends Animal implements flyable{
String Brand;
@Override
public void fly() {//接口的方法
System.out.println("猫在飞");
}
}
class Fish extends Animal{
public void swin(){}//父类的方法
}
class Dog extends Animal{
public void run(){}//父类的方法
}
七.接口的常见关系
-
类与类
-
单继承
-
extends 父类名称
-
类与接口
-
多实现
-
implements 接口名称1,接口名称2,接口名
-
接口与接口
-
多继承
-
extends 父接口,父接口,父接口n
package inter;
public class DuoJiCheng {
public static void main(String[] args) {
}
}
interface A{
void m1();
}
interface B{
void m2();
}
interface C{
void m3();
}
//类与接口之间的关系
class MyClass implements A,B,C{
@Override
public void m1() {
}
@Override
public void m2() {
}
@Override
public void m3() {
}
interface C extends A,B{//接口代表能力,无关于类型,不用重写方法
void m3();
}
}
常量接口:将多个常用于表示状态或固定值的变量,以静态常量的形式定义在接口中管理,提高代码可读性
package inter;
public class ChangLiangjie implements ChangLiang {
public static void main(String[] args) {
//猜拳(1.剪刀 2.石头 3 布)
//交通灯(1.红灯 2.黄灯 3绿灯)
//状态
int lightState=RED;//红灯
//判断
if (lightState == 1) {
lightState =GREEN;
}else if (lightState == 2) {
lightState =RED;
}else{
lightState=YELLOW;
}
System.out.println(lightState);
}
}
interface ChangLiang{
public static final int RED=1;
public static final int YELLOW=2;
public static final int GREEN =3;
}
七.宏观接口
概念:接口是一种标准.
耦合度:模块与模块之间的关联程度,关联越密切,耦合度越高,关联越松散,耦合越低.
八:接口的回调
接口回调:现有接口的使用者,后有接口的实现者
package inter;
/**
* 接口标准
* 只有执行此接口的对象才可以排序
* 接口
*/
/**
* 比较方法
* this与传入的students对象进行比较
* @param <T>另一个传入对象
* retudents
* 负数:this 靠前,stu靠后
* 正数:this靠后,stu靠前
* 0:不变
*/
public interface Compare<T> {
public int compareTo(T students);//Student students
}
package inter;
/**
* 可以帮助任何类型的一组对象进行排序
* 接口使用者(工具)
*/
public class Sort {
public static void sort(Studernt[] studernts){
for (int i = 0; i <studernts.length ; i++) {
Comparable currentStu= (Comparable)studernts[i];
int n=currentStu.compareTo(studernts[1+1]);//正数靠后
if (n >0) {
//俩值交换
Studernt temp =studernts[0];
studernts[0]=studernts[1];
studernts[1]=temp;
}
}
}
}
package inter;
/**
* 接口回调
*/
public class HuiDIao {
public static void main(String[] args) {
//对学生对象排序
Studernt[] students =new Studernt[]{
new Studernt("ton",22,"男",99),
new Studernt("kack",20,"男",98),
new Studernt("her",25,"男",97),
new Studernt("jay",21,"男",96),
};
//java.util.Arrays.sort(studernts);
//students[0].compareTo(students[1]);//编辑哦成绩,返回一个正数
//接口的调用者
Sort.sort(students);
for (int i = 0; i <students.length ; i++) {
System.out.println(students[i].name+"\t"+students[i].score);
}
}
}
//对学生对象排序
//接口实现者
class Studernt implements Comparable<Studernt>{
String name;
int age;
String sex;
double score;
public Studernt() {
}
public Studernt(String name, int age, String sex, double score) {
this.name = name;
this.age = age;
this.sex = sex;
this.score = score;
}
@Override
public int compareTo(Studernt studernt) {
if (this.score>studernt.score) {
return 1;
}else if(this.score<studernt.score){
return -1;
}
return 0;
}
}
/**
*ton 99.0
kack 98.0
her 97.0
jay 96.0
*
*/
package inter;
public class TestStu {
public static void main(String[] args) {
//要求:老师对象升序排序
Teacher[] teachers =new Teacher[]{
new Teacher("ton",22),
new Teacher("kack",20),
new Teacher("her",30),
new Teacher("jay",21),
};
java.util.Arrays.sort(teachers);//调用工具
for (int i = 0; i <teachers.length ; i++) {
System.out.println(teachers[i].name+"\t"+teachers[i].age);
}
}
}
class Teacher implements Comparable<Teacher>{
String name;
int age;
public Teacher() {
}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Teacher o) {
if(this.age>o.age){
return 1;
}else if(this.age<o.age){
return -1;
}
return 0;
}
}
九.接口的向下转型
package Interface.lianxi03;
interface A{
void moA();
}
interface B extends A{
void B();
}
interface C {
void C();
}
interface D extends B,C{
void D();
}
class E implements D{
@Override
public void moA() {
System.out.println("A的实现方法");
}
@Override
public void B() {
System.out.println("B的实现方法");
}
@Override
public void C() {
System.out.println("C的实现方法");
}
@Override
public void D() {
System.out.println("D的实现方法");
}
}
public class TestInterface {
public static void main(String[] args) {
A a = new E();
B b = new E();
C c = new E();
D d = new E();
//向下转型
if (a instanceof E) {
E e = (E) a;
e.moA();
} else if (b instanceof E) {
E e = (E) b;
e.B();
} else if (c instanceof E) {
E e = (E) c;
e.C();
} else if (d instanceof E){
E e = (E) d;
e.D();
}else {
System.out.println("转型失败");
}
System.out.println(c instanceof A);
System.out.println(c instanceof B);
System.out.println(c instanceof C);
System.out.println(c instanceof D);
System.out.println(c instanceof E);
}
}