什么是接口
接口是一种约定
有些接口只有名称
面向接口编程:
1、关心实现类有何能力,而不关心实现细节
2、面向接口的约定而不考虑接口的具体实现
接口的特性:
1)接口不可以被实例化
2)实现类必须实现接口的所有方法
3)实现类可以实现多个接口
implements、多个接口使用逗号隔开
4)接口中的变量都是静态常量(public static final)
使用时: public interface MyInterface {
public void foo();//方法
//其他方法
}
所有方法默认都是:
public abstract
在Java中,类与类之间是单根继承(一个类只能有一个直接父类)
■一个类只能继承一个类(单根继承),但是一个类可以实现多个接口,多个接口之间使用,分隔接口中的方法只能是抽象方法,默认修饰符都是public abstract
■一个类实现了一个接口,必须重写接口中的所有抽象方法,如果不重写,那么实现了类也要定义 为抽象类
■接口不能实例化,但是可以将接口的引用指向其实现类实例
■接口的变量都是静态常量,默认修饰public static final
接口中的方法都是抽象方法,默认修饰符是public abstract
■接口中的方法一定定义好之后就不要轻易的去修改,因为修改接口中的方法,接口的实现类都要对修改的方法进行重新操作,非常麻烦
■一个类要想新增一个功能,只需要新建一个接口,然后让这个类实现这个新建的接口就可以用这个接口定义的功能
接口的使用:
1)接口中的成员变量
默认都是public static final的,必须显式初始化
2)接口中的方法
默认都是public abstract的
3)接口没有构造方法,不能被实例化
4)一个接口不能实现另一个接口,但可以继承多个其他接口
5)一个类必须实现接口抽象方法(implements),除非这个类也是抽象类
接口的使用步骤:
1)编写USB接口 :根据需求设计方法
2)实现USB接口 :实现所有方法
3)使用USB接口 :用多态的方式使用
抽象类与抽象方法
抽象类VS普通类
1)抽象类不能被实例化
但可以创建一个引用变量,其类型是一个抽象类, 指向非抽象的子类实例
2)普通类可以被实例化
抽象方法VS普通方法
1)有无方法体
抽象类与抽象方法的使用:
1)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类
2)如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
3)没有抽象构造方法,也没有抽象静态方法
4)抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
抽象类与接口
抽象类VS接口
相同点:
1)代表系统的抽象层
2)都不能被实例化
3)都能包含抽象方法
■用于描述系统提供的服务,不必提供具体实现
不同点:
1)在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
■ 抽象类便于复用,接口便于代码维护
2)一个类只能继承一个直接的父类,但可以实现多个接口
使用原则:
1)接口做系统与外界交互的窗口
■接口提供服务
2)接口本身一-旦制定,就不允许随意修改
3)抽象类可完成部分功能实现,还有部分
功能可作为系统的扩展点
面向对象设计原则
1)多用组合,少用继承
2)针对接口编程
3)针对扩展开放,针对改变关闭
总结
◆Java中的接口
■属性全都是全局静态常量
■方法都是全局抽象方法
■无构造方法
◆一个类可以实现多个接口,非抽象类实现接口时必须
实现接口中的全部方法
◆抽象类利于代码复用,接口利于代码维护
接口代码:
定义一个抽象类:
package Lnterface.demo02;
public abstract class Door {
//定义开、关门功能
public abstract void openDoor();
public abstract void closeDoor();
}
定义两个接口:
package Lnterface.demo02;
public interface Lock {
//定义锁“开锁”和“上锁”的功能
public abstract void openLock();
public abstract void closeLock();
}
package Lnterface.demo02;
public interface TakePhoto {
//接口中的方法都是抽象方法,默认修饰符是public abstract
void image();
}
定义一个实现类:
package Lnterface.demo02;
/*
* 一个类只能继承一个类(单根继承),但是一个类可以实现多个接口,多个接口之间使用,分隔
* 接口中的方法只能是抽象方法,默认修饰符都是public abstract
*
* 一个类实现了一个接口,必须重写接口中的所有抽象方法,如果不重写,那么实现了类也要定义为抽象类
* 接口不能实例化,但是可以将接口的引用指向其实现类实例
*
* 接口的变量都是静态常量,默认修饰修饰public static final
*
*/
public class AntiTheftDoor extends Door implements Lock,TakePhoto{
@Override
public void openDoor() {
System.out.println("开门.......");
}
@Override
public void closeDoor() {
System.out.println("关门.......");
}
//重写方法
@Override
public void openLock() {
System.out.println("插钥匙,左三圈,开锁");
}
@Override
public void closeLock() {
System.out.println("插钥匙,右三圈,关锁");
}
@Override
public void image() {
System.out.println("你已进入拍照监控区.....");
}
}
定义一个测试类:
package Lnterface.demo02;
public class Test {
public static void main(String[] args) {
AntiTheftDoor atd=new AntiTheftDoor();
atd.closeDoor();
atd.closeLock();
atd.image();
System.out.println("出去玩.......");
atd.openDoor();
atd.image();
atd.openLock();
}
}