java基础-接口
接口:是一种规则,接口不表示事物,它更侧重于行为,是对行为的抽象
接口的定义:接口是使用关键字interface来定义的
public interface 接口名{}
接口不能实例化
接口和类之间是实现关系,通过implements来表示
public class 类名 implements 接口名{}
接口的子类(实现类)
1、要么重写接口里面全部的抽象方法(通常是采用这种方式)
2、要么也是抽象类
注意:接口和类的实现关系,可以是单实现也可以是多实现
public class 类名 implements 接口1,接口2{}


接口中成员的特点:
1、成员变量
只能是常量,默认修饰符:public static final


2、接口中是没有构造方法的

3、成员方法:JDK7以前,接口中只能写抽象方法,默认修饰符public abstract

接口和类之间的关系:
1、类和类之间是继承关系,并且只能是单继承,不能是多继承的关系,但是可以是多层继承
2、接口和类之间的关系:实现关系,可以是单实现,也可以是多实现,还可以在继承一个类的同事实现多个接口
3、接口和接口之间的关系,是继承关系,可以单继承也可以多继承
细节:如果实现类是实现了最下面的子接口的话,需要重写全部的抽象方法
小练习:

package com.jdL.day15classwork.question1;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;}
}
package com.jdL.day15classwork.question1;import com.jdL.day15classwork.Swim;public abstract class Player extends Person {public Player() {}public Player(String name, int age) {super(name, age);}//学习的方法public abstract void study();
}
package com.jdL.day15classwork.question1;public abstract class coach extends Person {public coach() {}public coach(String name, int age) {super(name, age);}//教学public abstract void teach();
}
package com.jdL.day15classwork.question1;public class pingpangPlayer extends Player implements learnEnglish {public pingpangPlayer() {}public pingpangPlayer(String name, int age) {super(name, age);}@Overridepublic void study() {System.out.println("学习打乒乓球");}@Overridepublic void learnEnglish() {System.out.println("学英语");}
}
package com.jdL.day15classwork.question1;public class baseketballPlayer extends Player{public baseketballPlayer() {}public baseketballPlayer(String name, int age) {super(name, age);}@Overridepublic void study() {System.out.println("学习打篮球");}
}
package com.jdL.day15classwork.question1;public class pingpangCoach extends coach implements learnEnglish {public pingpangCoach() {}public pingpangCoach(String name, int age) {super(name, age);}@Overridepublic void teach() {System.out.println("教学乒乓球");}@Overridepublic void learnEnglish() {System.out.println("学英语");}
}
package com.jdL.day15classwork.question1;public class baseketBallCoach extends coach{public baseketBallCoach() {}public baseketBallCoach(String name, int age) {super(name, age);}@Overridepublic void teach() {System.out.println("教学篮球");}
}
package com.jdL.day15classwork.question1;public interface learnEnglish {public abstract void learnEnglish ();
}
package com.jdL.day15classwork.question1;public class questionTest {public static void main(String[] args) {pingpangCoach coach = new pingpangCoach("张三",12);coach.learnEnglish();coach.teach();pingpangPlayer pingpangPlayer = new pingpangPlayer("张三壹",5);pingpangPlayer.learnEnglish();pingpangPlayer.study();baseketBallCoach coach2 = new baseketBallCoach("李四",18);coach2.teach();baseketballPlayer baseketballPlayer=new baseketballPlayer("李四贰",20);baseketballPlayer.study();}
}
接口扩展:
1、jdk8开始接口中新增的方法:
允许在接口中定义默认方法,需要使用默认关键字default修饰
作用:解决接口升级的问题
接口中默认方法的注意事项:
1、默认方法不是抽象方法,所以不会被强制重写,但是如果被重写,实现类重写的时候去掉default关键字
2、public可以省略,但是default不可以省略
3、如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
允许在接口中定义新增静态方法,需要用static修饰
比如:public static void show(){}
接口中静态方法的注意事项:
1、静态方法只能通过接口名调用,不能通过实现类或者对象名调用
2、public可以省略,但是static不可以省略
3、静态方法是不需要重写的
JDK9中新增的私有方法:
私有方法通常是把接口中相同的代码抽取出来,供接口中默认方法调用的

如果上面不是默认方法而是静态方法,那么私有方法也得是静态的

小结:

接口的应用:

