目录

前言

一、接口是什么?

二、接口需要注意的地方

 三、接口的具体实现以及代码

四、常用的三个接口

总结


前言

       java是面向对象的,而类与类之间存在继承,但父类里面总是存在着一些不需要具体的实现的方法,从而java推出了抽象方法,而抽象方法更抽象的表现就是接口了,接下来让我们一起走进java接口的世界!!!


一、接口是什么?

  接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现。

二、接口需要注意的地方

使用java接口需要注意的:

1.使用interface关键字来修饰 ;

2.接口当中的方法不能有具体的实现 要实现一定得加default(默认);

3.接口当中可以有static的方法 ;

4.里面所有的方法都是public的 ;

5.抽象方法默认是public abstract的;

6.接口是不可以被new来实例化的 ;

7.类和接口之间的关系是通过关键字implement来实现的 ;

8.当一个类实现了接口类就必须重写接口当中的抽象方法 ;

9.接口当中的成员变量默认是public static final修饰的 ;

10.当一个类实现一个接口之后重写这个方法的时候 方法前得加public ;

11.一个类可以通过extends来继承普通类或抽象类但只能继承一个类,同时也可以通过implements来实现多个接口接口之间用逗号隔开 ;

12.接口和接口之间可以用extends来操作他们之间的关系 意为:拓展 一个接口通过extends来拓展自己的功能,此时当一个类实现 拓展后的接口时,不仅仅是拓展前的抽象方法,还要写另一个接口的抽象方法;

 三、接口的具体实现以及代码

1.接口的简单实现

package demo3;
interface IShape {//接口
    public abstract void draw();
    default  void func(){
        System.out.println(" 1");
    }
    public static  void funStatic(){

    }
}
class Rect implements IShape{//也就是实现 
    @Override
    public void draw() {
        System.out.println("rect");
    }

 //   @Override
//    public void func() {
//        System.out.println("默认方法的重写");
//    }
}
public class Test {
    public static void drawMap(IShape iShape){//这里会完成动态绑定  接口也是可以的
        iShape.draw();
    }
    public static void main(String[] args) {
        IShape iShape = new Rect();
        iShape.draw();
        iShape.func();
        drawMap(iShape);
    }
}

2.接口里面的属性及方法

interface IA{
    public int a = 10;//默认是static final的 是常量  接口当中的成员变量默认是public static final修饰的
    void func();//public abstract
}
interface  IB{
    void funcb();
}
class Bc{

}
class C extends Bc implements IA,IB{
    //一个类可以实现多个接口 里面的方法都得重写  一个类可以继承普通类或抽象类来实现多个接口(如果是抽象类得重写抽象类的抽象方法)
    public  void func(){//必须是public的
        System.out.println("a");
    }
    public void funcb(){
        System.out.println("b");
    }
}

3.接口之间的拓展

interface IA1{
    void funcIA1();
}
interface IB1 extends IA1{//拓展b的功能
    void funcIB1();
}
class H implements IB1{
    @Override
    public void funcIA1() {
        System.out.println("a");
    }

    @Override
    public void funcIB1() {
        System.out.println("b");
    }
}

4.接口面向对象

class Animal{
    protected String name;

    public Animal(String name) {
        this.name = name;
    }
}
interface IFlying{
    void fly();
}
interface IRunning{//接口表示具有某种特性
    void run();
}
interface ISwimming{
    void swim();
}
class Brid extends Animal implements IFlying{

    public Brid(String name) {
        super(name);
    }

    @Override
    public void fly() {
        System.out.println(this.name + "正在飞");
    }
}
class Duck extends Animal implements IRunning,ISwimming,IFlying{

    public Duck(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println(this.name + "正在跑");
    }

    @Override
    public void swim() {
        System.out.println(this.name + "正在游泳");
    }

    @Override
    public void fly() {
        System.out.println(this.name + "正在飞");
    }
}
class Drog extends Animal implements IRunning,ISwimming{

    public Drog(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println(this.name + "正在跑");
    }

    @Override
    public void swim() {
        System.out.println(this.name + "正在游泳");
    }
}
class Robot implements IRunning{
    public Robot() {
    }

    @Override
    public void run() {
        System.out.println( "机器人正在跑");
    }
}
public class Test4 {
    public static void running(IRunning iRunning){
        iRunning.run();
    }
    public static void swimming(ISwimming iSwimming){
        iSwimming.swim();
    }
    public static void flying(IFlying iFlying){
        iFlying.fly();
    }
    public static void main(String[] args) {
        running(new Drog("青蛙"));
        swimming(new Duck("鸭子"));
        flying(new Brid("小鸟"));
        running(new Robot());
    }
}

四、常用的三个接口


用哪个接口取决于 业务 推荐Comparator(比较器) 三个常用接口: Comparable:这个借口有很大的缺点 对类的侵入性非常强 一旦写好了 不能轻易改动 Comparator:比较器 比较灵活 Cloneable:类之间的拷贝


1.Comparable的具体实现

class Student implements Comparable<Student>{//<>泛型  里面放类
    public int age;
    public String name;
    public double score;
    public Student(int age, String name, double score) {
        this.age = age;
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        /*if(this.score > o.score){
            return 1;
        }else if(this.score == o.score){
            return 0;
        }else{
            return -1;
        }*///普通的比较方法
        //return this.age - o.age;//从小到大排序
        return o.age - this.age;//从大到小排序
        //return this.name.CompareTo(o.name);
    }
}
public class Test {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student(12,"h",98);
        students[1] = new Student(19,"hh",97.5);
        students[2] = new Student(17,"hhh",60);
        System.out.println(students[1].compareTo(students[0]));//谁调用这个方法谁就是this
        Arrays.sort(students);//这里比较的就是compareTo里面的东西了 默认从小到大
        System.out.println(Arrays.toString(students));
    }
}

2.Comparator的具体实现

public class Test {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student(12,"h",98);
        students[1] = new Student(19,"hh",97.5);
        students[2] = new Student(17,"hhh",60);
        System.out.println(Arrays.toString(students));
        AgeComparator ageComparator = new AgeComparator();
        ScoreComparator scoreComparator = new ScoreComparator();
        Arrays.sort(students,ageComparator);
        Arrays.sort(students,scoreComparator);
        System.out.println(ageComparator.compare(students[0],students[1]));
        System.out.println(Arrays.toString(students));
    }
}
class ScoreComparator implements  Comparator<Student>{//分数比较器  比较灵活 对类的侵入性非常弱

    @Override
    public int compare(Student o1, Student o2) {

        return (int)(o1.score - o2.score);
    }
}
class NameComparator implements Comparator<Student>{//姓名比较器

    @Override
    public int compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);
    }
}
class AgeComparator implements Comparator<Student>{//年龄比较器

    @Override
    public int compare(Student o1, Student o2) {
        return o1.age - o2.age;
    }
}
class Student  {//<>泛型  里面放类
    public int age;
    public String name;
    public double score;

    public Student(int age, String name, double score) {
        this.age = age;
        this.name = name;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }


}

3.Cloneable的具体实现

//创建对象的方法  new 或者克隆接口
class Money implements Cloneable{
    double a = 13.5;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Person implements Cloneable{//这个接口是个空接口  作用就是表示这个类是可以克隆的

    public int age;
    public Money money = new Money();
    public void eat(){
        System.out.println("吃");
    }
    public Object clone() throws CloneNotSupportedException {//此时必须要重写克隆方法 比较特殊
        //return super.clone();//在这里需要看拷贝方法 才知道是浅拷贝还是深拷贝
        Person h = (Person) super.clone();
        h.money = (Money)this.money.clone();//这里就将引用也深拷贝了
        return h;
    }

    @Override
    public String toString() {
        return "Person{" +
                " age=" + age +
                '}';
    }
}
public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person();
        Person person1 = (Person) person.clone();//clone 类型是object的  要实现clone方法其类一定要实现克隆接口
        System.out.println(person1.age);
        person1.age = 20;
        System.out.println(person);
        System.out.println(person1);
        System.out.println("=======");
        Person person2 = (Person)person.clone();
        System.out.println(person.money.a);
        System.out.println(person2.money.a);
        System.out.println("=====");
        person2.money.a = 85.5;
        System.out.println(person.money.a);//这里就是浅拷贝
        System.out.println(person2.money.a);//改变之后就是深拷贝了
    }
}

总结

      这里仅仅简单介绍了接口以及几个常用的接口,接口在java里面还是比较常用的,所以更具体的接口各位也可以更深入的学习!!!