1.接口的概念
当不是所有子类, 而是多个子类都包含一个方法时, 为了代码书写规范性, 可以用自定义的接口来统一该方法的书写规范. 所以接口可以看作是一种书写规则.
接口是对行为的抽象
抽象类一般是书写在父类当中, 接口是单独书写的, 不是一种类
2.接口的定义和使用
3.接口中成员的特点
4.接口和类的关系
当一个类实现多个接口, 并且多个接口中有重名的方法时, 只用实现一个接口中的同名方法.(也就是说每个方法只实现一次)
若类implements子接口, 那么就需要重写所有的抽象方法(包括父接口方法)
5.接口和抽象类的综合案例
package cn.ncepu.demo1.a02abstrctdemo2;
public abstract class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public abstract void work();
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Person{name = " + name + ", age = " + age + "}";
}
}
package cn.ncepu.demo1.a02abstrctdemo2;
public class PingPong extends Person implements Speak{
public PingPong() {
}
public PingPong(String name, int age) {
super(name, age);
}
@Override
public void work() {
System.out.println("学打乒乓球");
}
@Override
public void speak() {
System.out.println("说英语");
}
}
package cn.ncepu.demo1.a02abstrctdemo2;
public class Basketball extends Person{
public Basketball() {
}
public Basketball(String name, int age) {
super(name, age);
}
@Override
public void work() {
System.out.println("学打篮球");
}
}
package cn.ncepu.demo1.a02abstrctdemo2;
public class PingPongCoach extends Person implements Speak{
public PingPongCoach() {
}
public PingPongCoach(String name, int age) {
super(name, age);
}
@Override
public void work() {
System.out.println("教打乒乓球");
}
@Override
public void speak() {
System.out.println("说英语");
}
}
package cn.ncepu.demo1.a02abstrctdemo2;
public class BasketballCoach extends Person{
public BasketballCoach() {
}
public BasketballCoach(String name, int age) {
super(name, age);
}
@Override
public void work() {
System.out.println("教打篮球");
}
}
package cn.ncepu.demo1.a02abstrctdemo2;
public interface Speak {
public abstract void speak();
}
package cn.ncepu.demo1.a02abstrctdemo2;
public class Test {
public static void main(String[] args) {
PingPong pingPong = new PingPong("乒乓球运动员", 18);
Basketball basketball = new Basketball("篮球运动员", 20);
PingPongCoach pingPongCoach = new PingPongCoach("乒乓球教练", 35);
BasketballCoach basketballCoach = new BasketballCoach("篮球教练", 38);
pingPong.work();
basketball.work();
pingPongCoach.work();
basketballCoach.work();
pingPongCoach.speak();
pingPong.speak();
}
}
6.接口中的新增方法
1.有方法体的方法接口
目的 : 为了在父类接口中添加新规则的同时又使已经实现的子类接口不报错
如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写 : 意思是当一个类implements多个接口时, 这几个接口中存在相同名字的默认方法, 这时如果创建类的实例来引用方法就不知道去哪个接口中寻找, 所以必须在类中重写该默认方法.
2. 在接口中定义静态方法
接口中的static方法不能被重写.
通过接口名.方法名(); 来调用static静态方法.
3.在接口中定义私有方法
目的 : 当默认方法和静态方法中有相同功能的代码块时(重复书写的部分), 就通过私有方法用来提取出来写一个方法, 在默认方法和静态方法中直接调用就可以
不加static的私有方法是为默认方法服务的
加static的私有方法是为静态方法服务的
7.接口应用
8.适配器设计模式
当我们不想重写接口中的所有方法, 而只想创建类实现接口中的部分方法时, 我们可以创建一个适配器类用来空重写接口的所用方法, 然后继承适配器类, 重写需要用到的方法就可以了. (一般适配器是abstrct的, 不让外部创建对象)