接口
抽象方法的本质是定义接口规范:即规定上层接口规范,让子类去继承实现抽象方法。
接口定义:如果一个类中没有字段,并且所有方法都是抽象方法,那么这个类可以改写成接口interface
,如下:
abstract class Student{
public abstract void Hello();
public abstract String getName();
public abstract int getAge();
}
那么这个类就可以改写成接口:interface
。
Java中用interface
来声明一个接口。
interface Student{
void Hello();
String getName();
int getAge();
}
其中修饰方法的
public abstract
可以省略不写。
接口interface
是一个纯抽象的,他没有字段,只有抽象方法。
用一个类来实现一个接口时,需要用到关键字implements
,一个类可以继承多个接口。
interface Student{
void Hello();
String getName();
int getAge();
}
interface Person{
void run();
}
class Stu_Ming implements Student,Person{
private int age;
private String name;
public void Hello(){
System.out.println("Hello World");
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void run(){
System.out.println("I am running!");
}
}
用一个接口来继承接口时,需要用到关键字extends
,一个接口可以继承多个接口。
interface Student{
void Hello();
String getName();
int getAge();
}
interface Person extends Student{
void run();
}
abstract class | interface | |
---|---|---|
继承 | 只能extends一个类 | 可以implements多个interface |
字段 | 可以定义实例字段 | 不能定义实例字段 |
抽象方法 | 可以定义抽象方法(abstract) | 定义的均为抽象方法(默认public abstract ) |
非抽象方法 | 可以定义非抽象方法 | 可以定以default方法 |
interface
不能定义变量,但是可以定义常量,默认修饰符为public static final
,全局静态常量,必须在定义时初始化,且初始化之后不能改变,可以通过接口名.常量
的方法进行访问。- 接口的命名规则与类型不同,如果修饰符是
public
,那么该接口在整个项目中可见;如果省略修饰符,那么该接口只能在该包可见。interface
中不能有构造函数。- 接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。
- 当一个类同时
extends
一个父类和implements
多个接口时,extends
必须位于implements
之前。
default
方法
default
修饰方法只能在接口中使用,在接口中被default
标记的方法为普通方法,可以直接写方法体。
- 实现类会集成接口中的
default
方法
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.Hello();
}
}
interface Person{
public default void Hello(){
System.out.println("Hello world!");
}
}
class Student implements Person{
}
输出:
Hello world!
- 如果一个类同时实现接口Person和Animal,接这两个接口中有相同的
default
方法,这时,必须重写接口中的default
方法
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.Hello();
}
}
interface Person{
public default void Hello(){
System.out.println("Hello Person!");
}
}
interface Animal{
public default void Hello(){
System.out.println("Hello Animal!");
}
}
class Student implements Person,Animal{
public void Hello(){
System.out.println("Hello Student!");
}
}
输出:
Hello Student!
重写的原因:类在继承接口中的
default
方法时,不知道该继承哪一个接口的default
方法。
- 子类同时继承父类和接口,且父类和接口中都有Hello方法(接口的用
default
修饰),那么子类会继承父类的Hello方法而不是接口的方法。
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.Hello();
}
}
interface Person{
public default void Hello(){
System.out.println("Hello Person!");
}
}
class Animal{
public void Hello(){
System.out.println("Hello Animal!");
}
}
class Student extends Animal implements Person{
}
输出:
Hello Animal!