接口:
1、引出接口:发现没有继承关系的类也能共享行为;
2、接口是一种独立与类的新机制,它关注的是行为,设计上大仙有行为在多个没有继承关系的类之间共享,就把它抽取到接口中,而不是蟹岛父类中;
3、1)定义接口——关键字interface;
public interface Serviceable extends Changeable{
//属性---只能公共静态常量属性---就算不写这三个关键字,也是默认为这种情况
//这说明接口的关注点不在属性身上,而是在行为身上
// public static final int a = 100; 默认常量必须赋初值
// public static int b = 200; 三个关键字:public、static、final
// public int c = 300;
// int d = 400;
// 说明接口的关注点不在属性身上,关注的是行为;
构造——接口不能有构造
接口不能产生对象,而是申明对象;
(1 让类实现接口,而且是多实现;
(2 接口可以继承接口,而且是多继承;
行为——只能是公共的抽象方法,就算不写修饰符,也是默认这种情况;说明接口的专注点和丰富度是体现在行为上的;接口的意义就体现在:让没有继承关系的类共享这些行为,各有各的具体实现;
public abstract void turnupEnginee();
void changeOil();
在JDK1.7以上版本,允许接口拥有实现了的方法;
但必须使用default关键字修饰;
public default void test(){
}
2)类实现接口:
类实现接口:使用implements关键字,并且重写接口中的抽象方法,类可以多实现接口;
public interface Changeable {
public void changeOil();
}
如果一个类实现一个接口,但不能实现它的所有抽象方法,那么这个类只能是抽象类;
public abstract class NewCar implements Serviceable{
}
类在继承的同事可以做实现接口;
类实现接口,必须重写接口中所有抽象方法,否则该类是抽象类;
3)接口可以继承接口,多继承——尽量定义小接口(接口隔离原则);

4、应用多态:
接口的引用 指向 实现类的对象
public class NewMerchanic {
public void service(Serviceable ser){
ser.changeOil();
ser.turnupEnginee();
if(ser instanceof Hock){
Hock h = (Hock)ser;
h.jiao();
}
if(ser instanceof Fireable){
Fireable f = (Fireable)ser;
f.fire();
}
}
}
public interface Serviceable extends Changeable,Turnupable{
}
public interface Turnupable {
public void turnupEnginee();
}
public interface Changeable {
public void changeOil();
}
public interface Fireable {
public void fire();
}
public class NewPlane implements Serviceable {
@Override
public void changeOil() {
// TODO Auto-generated method stub
System.out.println("我用的是航空机油");
}
@Override
public void turnupEnginee() {
// TODO Auto-generated method stub
System.out.println("有一个班的人为我调试引擎");
}
}
public class Hock extends NewPlane implements Fireable{
@Override
public void fire() {
// TODO Auto-generated method stub
System.out.println("可以发射捣蛋");
}
public void jiao(){
System.out.println("喔喔喔喔喔喔");
}
}
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Hock h = new Hock();//可以看到Hock本类引用指向的本类对象身上所有的属性,行为
NewPlane np = new Hock();//只能看到NewPlane父类引用指向子类对象身上的属性、行为
Serviceable ser = new Hock();//只能看到Serviceable接口提供的行为
Fireable f = new Hock();//只能看到Fireable接口提供的行为
NewMerchanic fox = new NewMerchanic();
fox.service(h);
}
}
如果没有实现接口,就算有同样的方法,也不能用接口的引用区指向它的对象
5、接口与抽象类的区别:
相同特征:都不能被实例化,都位于继承的顶端,用于被其它类实现或者继承;
都包含抽象方法,实现接口或者继承抽象类的子类都必须实现这些抽象方法;
不同特征:接口中只能包含抽象类方法;抽象类中可以包含普通类方法;
接口中不能定义静态方法;抽象类可以定义静态方法;
接口只能定义静态常量属性、不能定义普通属性;抽象类既可以定义普通属性、也可以定义鼎泰常量属性;
接口不包含构造器;抽象类中可以包含构造器(抽象类中的构造器不是用于创建对象,而是让子类调用这些构造器来完成属于抽象类的初始化工作);
接口不包含初始化块;抽象类可以包含初始化块;
语法:
| 抽象类 | 接口 |
| abstract class定义 | instanceof implements定义 |
| 抽象方法必须写abstract | 抽象方法可以不写abstract |
| 可以有变量属性,构造方法 | 不能有变量属性,只能是公共静态常量,不能有构造 |
| 可以实现了的方法 |
JDK1.7之前不能有实现的方法; JDK1.7之后可以有实现的方法,但必须有default关键字 |
使用语法:
| 用子类继承抽象类;extends(单继承) | 用实现类 实现接口,instanceof;用子接口继承接口:extends(多继承) |
设计原则:一部分类,一部分写接口;
例

小结:
接口是一个要被类实现的抽象方法集合,类用关键字implements实现接口;
实现接口的类必须实现接口中定义的每个方法,否则类必须被声明为“abstract”;
一个接口可以被用于暴露类的某些方法,也可以强制类包含某些方法;
一个类可以包含成员变量,接口中默认访问修饰符: public, static, final;
一个接口可以继承一个或多个接口;
练习题:
public interface Flyable{ public void fly(); }
public class Bird implements Flyable{ @Override public void fly(){ System.out.println("鸟拍着翅膀飞.....“); } }
public class SuperMan implements Flyable{ @Override public void fly(){ System.out.println("超人穿着内裤飞...."); } }
public class JetPlane implements Flyable{ @Override public void fly() { System.out.println("飞机喷着气飞...."); } }
public class AirManager { public void manage ( Flyable flting ) { System.out.println("发现:"); flying.fly(); if ( flying instanceof Bird){ System.out.println("马上召集人手打下来!"); }eles if(flying instanceof JetPlane){ System.out.println("发射导弹,打下来"); }else if(flying instanceof SuperMan){ System.out.println("老婆,出来看上帝!"); } } }
浙公网安备 33010602011771号