Interface接口简介

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。


接口与类的区别:

  • 接口不能用于实例化对象
  • 接口没有构造方法
  • 接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。

Animal类:

package com.test.interfa;

// 抽象方法需要 abstract 抽象类
public abstract class Animal {
    private String name;
    private int age;

    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    // 吃的方法不一样,使用abstract 抽象方法
    public abstract void eat();
}

Swim接口interface:

package com.test.interfa;

public interface Swim {
    public abstract void swim();
}

Frog青蛙类:

package com.test.interfa;

public class Frog extends Animal implements Swim{

    public Frog() {
    }

    public Frog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("小青蛙在吃蟲子!");
    }

    @Override
    public void swim() {
        System.out.println("小青蛙在游泳!");
    }
}

Rabbit兔子类:

package com.test.interfa;

public class Rabbit extends Animal{

    public Rabbit() {
    }

    public Rabbit(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("小白兔吃萝卜!");
    }
}

Test类:

package com.test.interfa;

public class Test {
    public static void main(String[] args) {
        Frog f = new Frog("小青蛙",3);
        System.out.println(f.getName() + "," + f.getAge());
        f.eat();
        f.swim();

        Rabbit r = new Rabbit("小白兔",6);
        System.out.println(r.getName() +","+ r.getAge());
        r.eat();
    }
}

运行结果:

小青蛙,3
小青蛙在吃虫子!
小青蛙在游泳!

小白兔,6
小白兔吃萝卜!


接口特性

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

Java笔记—Java接口_静态方法

抽象类和接口的区别

  • 1. 接口不能有方法体(默认方法使用 default 关键字),抽象类可以有(仅限java8以前)
  • 2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  • 3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法(仅限java8以前)
  • 4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。


静态方法

从java8开始接口里可以有静态方式,但是接口里的静态方法的修饰符只能是public,且默认是public static

interface Test{
    static void test1(){//不写public也可,默认为public
        System.out.println("静态方法");
    }
}

class TestClass{
    public static void main(String[] args){
        Test.test1();//与调用普通类的静态方法一致
    }
}

非静态方法

java8里,除了可以在接口里写静态方法,还可以写非静态方法,但是必须用default修饰,且只能是public,默认也是public default,这方法称为默认方法。

interface Test{
		default void test1(){	//不写public也可,默认为public
				System.out.println("默认方法");
		}	//该方法需要实例化后调用,可使用匿名内部类进行实例化
}

接口有以下特性:

  • 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
  • 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
  • 接口中的方法都是公有的。


在实现接口的时候,也要注意一些规则:

  • 当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
  • 一个类可以同时实现多个接口。
  • 一个类只能继承一个类,但是能实现多个接口。
  • 一个接口能继承另一个接口,这和类之间的继承比较相似。


Java笔记—Java接口_静态方法_02

Person类:

package com.test.interfa;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Sporter运动员类:

package com.test.interfa;

public abstract class Sporter extends Person{
    public Sporter() {
    }

    public Sporter(String name, int age) {
        super(name, age);
    }

    // 乒乓球运动员和籃球远动员学习方法不一样,所以使用抽象方法
    public abstract void study();
}

Coach教练类:

package com.test.interfa;

public abstract class Coach extends Person{

    public Coach() {
    }

    public Coach(String name, int age) {
        super(name, age);
    }

    public abstract void teach();
}

English接口:

package com.test.interfa;

public interface English {

    // 接口的成員必須是抽象方法
    public abstract void speakEnglish();
}

PingPangSporter乒乓球运动员:

package com.test.interfa;

public class PingPangSporter extends Sporter implements English{
    // 鼠標點擊紅色下劃線,ARTL + 回車 重寫父類方法

    public PingPangSporter() {
    }

    public PingPangSporter(String name, int age) {
        super(name, age);
    }

    @Override
    public void study() {
        System.out.println("乒乓球运动员在学习打乒乓球!");
    }

    @Override
    public void speakEnglish() {
        System.out.println("乒乓球運動員在說英語!");
    }
}

BaskballSporter篮球运动员类:

package com.test.interfa;

public class BaskballSporter extends Sporter implements English{
    public BaskballSporter() {
    }

    public BaskballSporter(String name, int age) {
        super(name, age);
    }

    @Override
    public void speakEnglish() {
        System.out.println("藍球運動員在說英語!");
    }

    @Override
    public void study() {
        System.out.println("藍球運動員在學習打籃球!");
    }
}

Test测试类:

package com.test.interfa;

public class Test {
    public static void main(String[] args) {
        PingPangSporter pps = new PingPangSporter("刘诗雯",23);
        System.out.println(pps.getName() +","+ pps.getAge());
        pps.study();
        pps.speakEnglish();
    }
}

运行结果:

刘诗雯,23

乒乓球运动员在学习打乒乓球!

乒乓球运动员在說英語!








阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java