java中接口的定义与实现
接口的作用
制定规则
制定规则的两种方案
- 定义类:类中书写抽象方法(不建议使用,因为类只能单一继承)
- 定义接口:接口中书写抽象方法(建议使用,因为接口可以实现多继承)
接口的定义
public interface 接口名子{
//抽象方法
}
注意:
- 接口不能实例化,即接口不能创建对象
- 接口中没有构造方法,接口只能通过子类实现对象创建
- 接口可以实现多继承,一个类可以实现多个接口,解决了一个类只能单一继承的问题
接口实现类的定义
public class 接口实现类名字 implements 接口名字{
//重写接口中的所有方法
}
示例:
定义接口DemoInterface
public interface DemoInterface {
void show();
}
定义实现类DemointerfaceImpl
public class DemoInterfaceImpl implements DemoInterface{
@Override
public void show() {
System.out.println("实现接口类show()方法");
}
}
如果未实现接口中的方法会发生报错(idea中ctrl + o 快捷方法重写)
接口的多实现
public class 接口实现类名字 implements 接口名字1, 接口名字2, ... 接口名字n{
//重写所有接口中的所有方法
}
定义接口DemoInterfaceOne, DemoInterfaceTwo
public interface DemoInterfaceOne {
void showOne();//接口中方法可以省略public abstract
}
public interface DemoInterfaceTwo {
void showTwo();
}
定义实现类DemoInterfaceImpl
public class DemoInterfaceImpl implements DemoInterfaceOne, DemoInterfaceTwo{
@Override
public void showOne() {
System.out.println("实现DemoInterfaceOne的showOne()方法");
}
@Override
public void showTwo() {
System.out.println("实现DemoInterfaceTwo的showTwo()方法");
}
}
在接口中可以书写的内容
-
抽象方法
-
静态常量
静态常量在程序中做啥嘞?
在我们生活中会存在一些固定不变的且值比较单一的数据,比如我们的性别(别跟我说人妖,你个杠精!)
//在程序中可以定义这样的接口 public interface Gender{ public static final String M = "男"; public static final String F = "女"; } //当程序中需要给程序赋值的时候可以这样做 String S = Gendet.M;
-
成员方法
类和接口的概念
-
类和类之间的关系:继承,只能单继承,但是可以多层继承
public class 子类 extends 父类{ }
-
类和接口之间的关系:实现,可以单实现,也可以多实现,还可以继承一个类的同时实现多个接口
public class 子类 implements 接口{ }
-
接口和接口之间的关系:继承关系,可以单继承,也可以多继承
public 接口1 extends 接口2{ }
那为什么接口中可以多继承嘞?
那是因为呀接口中仅仅定义了功能,没有功能的实现,子类要自己实现功能
接口和抽象类的区别
它们的相同之处:
- 接口和抽象类都不能实例化
- 接口和抽象类都具有抽象方法
- 接口和抽象类都是作为父类存在的
接口和抽象类的区别:
- 抽象类:除了抽象方法之外,还有成员变量、构造方法、非抽象方法
- 接口:除了抽象方法之外, 只有常量、(JDK8:默认方法、静态方法)、(JDK9:私有方法)
为了更具体了解,我们可以来实现一个小案例:
- 男唱跳练习生:姓名、年龄、唱跳
- 女唱跳练习生:姓名、年龄、唱跳
- 男练习生:姓名、年龄、唱跳、打篮球
- 女练习生:姓名、年龄、唱跳、打篮球
- 男练习生不爱唱跳,女练习生爱唱跳
通过分析得出:
- 姓名、年龄、唱跳是共性内容
- 打篮球是特有功能
具体实现:
-
目录结构
-
Person抽象类
public abstract class Person { //共性内容:姓名、年龄、唱跳 private String name; private int age; public abstract void singDance(); }
-
PlayBasketball接口类
public interface PlayBasketball { public void playBasketball(); }
-
Boy类
public class Boy extends Person{ @Override public void singDance() { System.out.println("男孩在唱跳!"); } }
-
Girl类
public class Girl extends Person{ @Override public void singDance() { System.out.println("女孩在唱跳!"); } }
-
SingDanceBoy类
public class SingDanceBoy extends Boy{ }
-
SingDanceGirl类
public class SingDanceGirl extends Girl{ }
-
TraineeBoy类
public class TraineeBoy extends Boy implements PlayBasketball{ @Override public void playBasketball() { System.out.println("男孩在打篮球~"); } }
-
TraineeGirl类
public class TraineeGirl extends Girl implements PlayBasketball{ @Override public void playBasketball() { System.out.println("女孩在打篮球~"); } }
-
Test类
public class Test { public static void main(String[] args) { //创建男唱跳 SingDanceBoy sDBoy = new SingDanceBoy(); sDBoy.singDance(); //男练习生 TraineeBoy traineeBoy = new TraineeBoy(); traineeBoy.singDance(); traineeBoy.playBasketball(); } }
Test运行结果: