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 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
抽象类和接口的区别
- 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关键字。
- 接口中的方法都是公有的。
在实现接口的时候,也要注意一些规则:
- 当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
- 一个类可以同时实现多个接口。
- 一个类只能继承一个类,但是能实现多个接口。
- 一个接口能继承另一个接口,这和类之间的继承比较相似。
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
乒乓球运动员在学习打乒乓球!
乒乓球运动员在說英語!