Java Se----接口

来源:互联网 发布:mac 关闭已打开的程序 编辑:程序博客网 时间:2024/05/17 07:27

接口

一.概念:相当于特殊的抽象类

二.语法

a) 定义接口:interface  接口名称{ }

b) 实现接口:implements  接口名称{ }

三.与抽象类的异同

a) 相同点:

i. 不能new对象

ii. 都可以编译成字节码文件

iii. 都可以作为引用类型

b) 不同点

i. 接口中所有属性都是公开静态常量,隐式使用public static final修饰

public class TestBaseInterface{public static void main(String[] args){// new MyClass();// new MyInterface();//错误:都是抽象的无法实例化// MyClass mc;// MyInterface mi; //正确:都可以作为引用类型// System.out.println(MyClass.a); // 错误: 接口中所有属性都是公开静态常量 无法从静态上下文中引用非静态 变量 a// MyInterface.a = 20;// 错误: 接口中所有属性都是公开静态常量 无法为最终变量a分配值System.out.println(MyInterface.a); //正确}}abstract class MyClass{int a = 10;public void m1(){}public static void m2(){}public abstract void m3();}interface MyInterface{public static final int a = 10;//公开静态常量public abstract void m1();//公开抽象方法}

ii. 接口中所有方法都是公开抽象方法,隐式使用public abstract修饰

iii. 接口中没有构造方法,没有动态、静态代码块

四.关系

a) 类与类:继承关系,单继承

b) 类与接口:多实现关系

c) 接口与接口:多继承关系

d) 注:一个类在继承父类的同时,还可以实现多个接口

五.规范

a) 任何类在实现接口的同时,必须实现接口中的所有抽象方法,否则该类还是抽象类

b) 实现接口中的抽象方法,访问修饰符必须是public

六.应用场景:Java为单继承,当父类提供的方法个数无法满足子类需求时,可以通过实现接口来扩充子类的能力

public class TestPrinter{public static void main(String[] args){Printer printer = new Printer();Transfable tf1 = new BlackInkBox();Transfable tf2 = new Bowl();printer.print(tf1);}}class Printer{public void print(Transfable tf){System.out.println("使用" + tf.getColor() + "的墨水打印");}}interface Transfable{public abstract String getColor();}class BlackInkBox implements Transfable{public String getColor(){return "黑色";}}class Bowl implements Transfable{public String getColor(){return "彩色";}}


七.引用:

a) 接口引用指向实现类对象,仅可调用接口中所声明的方法

interface Runnable{public abstract void run();//接口的方法是 一种约定}interface Swimmable{public abstract void swim();}interface Flyable{void fly();}
public class TestAnimals{public static void main(String[] args){// Animal a = new Cat();// a.eat(); //正确 父类引用指向子类对象,仅可调用父类中所声明的属性和方法// Runnable r = new Dog();// r.eat(); //错误: 找不到符号// r.run();//正确  接口引用指向实现类对象,仅可调用接口中所声明的方法}public static void m(Runnable r){r.run();}}abstract class Animal{public abstract void eat();}class Dog extends Animal implements Runnable,Swimmable{public void eat(){System.out.println("狗在吃骨头");}public void run(){System.out.println("狗在狂奔");}public void swim(){}}class Cat extends Animal implements Runnable{public void eat(){System.out.println("猫在吃鱼");}public void run(){}}class Fish extends Animal implements Swimmable{public void eat(){System.out.println("鱼在吃虾米");}public void swim(){}}class Bird extends Animal implements Runnable,Flyable{public void eat(){System.out.println("鸟在吃虫儿");}public void run(){}public void fly(){}}class Bus implements Runnable{public void run(){}}



b) 使用接口作为方法形参,可以更自然的使用多态

八.接口回调:先有接口使用者,后有接口的实现者

好处: 1.设计与实现完全分离

      2.更容易搭建程序框架

              3.更容易更换实现

                      4.程序的耦合降低

import java.util.Arrays;  //接口回调public class TestBackInvoke{public static void main(String[] args){Student s1 = new Student("tom",20,'男',100D);Student s2 = new Student("jack",21,'男',99D);Student s3 = new Student("marry",19,'女',98D);Student s4 = new Student("anni",20,'女',100D);Student[] stus = new Student[]{s1,s2,s3,s4};MyArrays.sort(stus);for(int i =0;i < stus.length;i++){System.out.println(stus[i].name + "\t" + stus[i].score);}}}class Student implements Comparable<Student>{String name;int age;char sex;double score;public Student(String name,int age,char sex,double score){this.name = name;this.age = age;this.sex = sex;this.score = score;}public int compareTo(Student s){ //比较规则(分数降序)System.out.println("CompareTo Method Executed");if(this.score > s.score){return -1;//返回-1,则this靠前}else if(this.score < s.score){return 1;//返回整数,则this靠后}else{return 0;}}}class MyArrays{//冒泡排序public static void sort(Student[] stus){for(int i = 0;i < stus.length-1;i++){for(int j = 0;j < stus.length-1-i;j++){int result = stus[j].compareTo(stus[j+1]);if(result == 1){Student temp = stus[j];stus[j] = stus[j+1];stus[j+1] = temp;}}}}}


0 0
原创粉丝点击