接口一系列概念
接口是个啥?
接口:对方法的抽象(简而言之,只有方法,没有方法体)。
public void lockDoor(String input);
为啥要用接口?
有些场景下,假设你需要用到抽象的功能、属性,于是你用到的父类、子类来实现;当子类有自己想要实现的特殊方法,可以对父类进行重写来实现,可但现在你遇到的问题是:你写父类方法的时候有好多种情形,这些都是并列的,是你打算在子类重写的时候用,但是父类怎么办呢?你说:我可以随便写一个嘛,只要子类重写不就好了。
这样的确没错,但是这样的方式,多写了一次无用的代码不说,如果一个不小心忘记在子类中重写这个方法,就会导致函数执行错误方法。
举个栗子:
假设动物是一个父类,老虎、猫、狗、鸟是子类,吃是他们共有方法,每个子类都会重写这个方法,毕竟吃的东西不一样,但是问题来了,在父类中,应该“吃什么呢”?
再假设一个大佬工程师在设计界面,他需要设计一个按键,对于每个开发人员来说,这个按键触发的事件是根据需求变化的,大佬工程师在一开始设计的时候也不会把功能写进去。
这时候接口的出现就显得尤为必要,只管声明方法,具体方法体(方法如何实现),通过其他类来实现。
接口的定义
关键字 interface
public interface 接口名{}
属性:默认为 static+final 属性,必须要赋初值,可以用接口名直接调用属性。
方法:没有方法体 —— 默认抽象方法。必须要在新的类里面重写方法体。
public void lockDoor(String input);
接口的特点
接口不可以直接创建对象。
接口的使用方法
- 定义一个新的类实现接口。
public 类名 implements 接口名 {}
- 在类中重写接口所有抽象方法。
重写规则和继承一样:函数方法名、传参要和接口一致。
static,final两个相近但是彼此没什么关系的概念
static 静态的、唯一
修饰范围:属性、方法、成员内部类(类中的成员类)
特 点:
- 不管有多少对象,static修饰的资源只有一份。(其中某个对象改变这个值,所有对象的这个值都改变)
2. 被修饰的资源属于类,类名可以直接调用。(eg:animal.name="瓜瓜",animal是类名, 不是对象名)
public interface LockIF {
String brandName="masterlock"; //接口内定义属性,默认为static final属性
public void openDoor(String input);
}
public static void main(String[] args) {
System.out.println(LockIF.brandName); //直接通过接口名调用
}
final 最终形态 不可改变(类比c++中的const)
修饰范围:属性、方法、成员内部类(类中的成员类)
特 点:
- 被修饰的资源属于对象。(但只要static修饰过,这个资源还是属于类。)
- 被修饰的属性:不可改变,需要初始化(初始化可以在定义的时候,也可以利用构造函数初始化)。
- 被修饰的方法:不能重写。
- 被修饰的类:不能被继承(派生子类)。
练习代码:
//练习:书写一个锁为接口,有开门方法,有不同种类、方式的锁可以实现开门,重写开门方法
public interface LockIF { //设置一个锁接口
String brandName="masterlock"; //初始化属性
public void openDoor(String input); //定义抽象方法——————开门
}
//第一个类——————指纹解锁
public class FingerprintLock implements LockIF{ //重写方法
@Override
public void openDoor(String input) {
if(input.equalsIgnoreCase("userFingerprint")) {
System.out.println("The door is open, Welcome to home, my host! ——————————yours " + LockIF.brandName); //直接用接口名调用属性
}
else
System.out.println("Recognize Failed.");
}
}
//第二个类——————密码解锁
public class passwordLock implements LockIF{
@Override
public void openDoor(String input) {
if (input.equalsIgnoreCase("131590")) {
System.out.println("The door is open, Welcome to home, my host! ——————————yours " + LockIF.brandName);
else
System.out.println("The password is wrong.");
}
}
……
public class Door {
public static void main(String[] args) {
System.out.println(LockIF.brandName);
FingerprintLock l3 = new FingerprintLock();
passwordLock l5 = new passwordLock();
l3.openDoor("userFingerprint");
l3.openDoor("");
l5.openDoor("131590");
l5.openDoor("2612213");
}
}