1、接口
接口就是比抽象类还抽象的抽象类,可以更加规范的对子类进行约束。
接口的本质是契约,定义的是一组规则,就像法律一样,制定好了大家都要遵守。
- 特性:
(1)接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract,写不写都是这个(只能是 public abstract,其他修饰符都会报错)。
(2)接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量,写不写都是这个(并且只能是 public,用 private 修饰会报编译错误)。
(3)接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
2、接口的使用
(1)接口的声明
[访问修饰符] interface 接口名 [extends 父接口1,父接口2。。。]{
常量定义 //一定是public static final
方法定义 //一定是public abstract
}
(2)接口的实现
[访问修饰符] class 类名 implements 父接口{
自己的变量、常量等等
要实现的接口中的方法。。。。
}
(3)示例
我们想把猫、狗、猪的移动、吃等方法抽象出来进行规范,这时候只要定义一个抽象类Animal,并向其中添加动、吃等抽象方法,再由猫、狗等继承即可。
但是我们想把汽车、鸟、火箭、海马的移动方法抽象出来,再通过让他们继承抽象类的方式未免有些牵强,因为他们本就是风马牛不相及的几类东西,这时候让他们继承同一个类不太现实,并且海马、鸟本身还可能继承了Animal类,由于类是单继承的,所以它们不能再继承其他类了。所以这时候就需要用到接口了,因为他的抽象级别更高,通常用来抽象功能,这时候用接口就十分合适了。
-
Move.class(接口的后缀名也是class)
public interface Move {
int Max_Speed = 100; //public static final int
int Min_Speed = 10; //public static final int
void move ();
}
-
Car.class
class Car implements Move{
static String name = "拖拉机";
@Override
public void move() {
System.out.println(name+"最大速度为"+Max_Speed);
}
}
-
Bird.class
class Bird implements Move{
String name = "小红";
int Min_Speed = 20;
@Override
public void move() {
System.out.println(name+"最小速度为"+Min_Speed);
}
}
-
Test_Interface.class
public class Test_Interface {
public static void main(String[] args) {
Car c = new Car();
Bird b = new Bird();
c.move();
// c.Min_Speed = 1; //final 常量不可更改
b.move();
b.Min_Speed = 30;//父子存在同名变量,父类的变量将被隐藏,子类中此变量不是常量故可改
b.move();
}
}
注:
- 子类的成员变量如果和父类的成员变量相同(包括类型不同)父类的成员变量将会被隐藏。
常量不可修改,变量通常设成私有,然后通过get、set方法进行读写。
image.png
3、接口和类的区别
- 接口不能用来实例化对象。
- 接口没有构造方法。
- 接口支持多继承(只能继承其他接口),类只能单继承。
4、接口和抽象类的区别
- 抽象类要被子类继承,接口要被类实现。
- 抽象类主要用来抽象类别,接口主要用来抽象功能。(接口的抽象级别最高)
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
网友评论