> 文章列表 > java学习之接口二

java学习之接口二

java学习之接口二

目录

一、接口vs继承

一、继承

二、接口 

二、接口多态特性

一、多态参数

二、多态数组

三、多态传递

三、接口练习


一、接口vs继承

一、继承

package com.hspedu.interface_;public class ExtendsVsInterface {public static void main(String[] args) {LittleMonkey  wuKong = new LittleMonkey("悟空");wuKong.climbing();}
}
//父类
class Monkey{private String name;public Monkey(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void climbing(){System.out.println(name + "猴子会爬树...");}
}
class LittleMonkey extends Monkey{public LittleMonkey(String name) {super(name);}
}

子类继承了父类,也继承了父类的方法,根据继承查找原则,就会输出以下内容 

二、接口 

但是如果希望“悟空”能像鱼一样游泳,像鸟儿一样飞翔,就只能通过实现接口来完成

package com.hspedu.interface_;public class ExtendsVsInterface {public static void main(String[] args) {LittleMonkey  wuKong = new LittleMonkey("悟空");wuKong.climbing();wuKong.swim();}
}
//父类
class Monkey{private String name;public Monkey(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void climbing(){System.out.println(name + "猴子会爬树...");}
}//接口
interface Fishable{void swim();
}
class LittleMonkey extends Monkey implements Fishable{public LittleMonkey(String name) {super(name);}@Overridepublic void swim() {System.out.println(getName() + "通过学习可以像鱼儿一样游泳...");}
}

 由于一个类可以实现多个接口,所以也可以实现像鸟儿一样飞翔

package com.hspedu.interface_;public class ExtendsVsInterface {public static void main(String[] args) {LittleMonkey  wuKong = new LittleMonkey("悟空");wuKong.climbing();wuKong.swim();wuKong.fly();}
}
//父类
class Monkey{private String name;public Monkey(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void climbing(){System.out.println(name + "猴子会爬树...");}
}//接口
interface Fishable{void swim();
}
interface Birdable{void fly();
}
class LittleMonkey extends Monkey implements Fishable,Birdable{public LittleMonkey(String name) {super(name);}@Overridepublic void swim() {System.out.println(getName() + "通过学习可以像鱼儿一样游泳...");}@Overridepublic void fly() {System.out.println(getName() + "通过学习可以像鸟儿一样飞翔...");}
}

 小结: 当子类继承了父类, 就自动的拥有父类的功能
如果子类需要扩展功能, 可以通过实现接口的方式扩展.
可以理解实现接口 是 对 java 单继承机制的一种补充.

二、接口多态特性

一、多态参数

 

package com.hspedu.interface_;public class Computer {//编写一个方法,计算机工作//解读://1.UsbInterface usbInterface形参是接口类型UsbInterface//2.可以接收Camera类和Phone类的对象实例(实参),因为这两个类实现了UsbInterface接口public void work(UsbInterface usbInterface){usbInterface.start();usbInterface.stop();}
}
package com.hspedu.interface_;public class Interface01 {public static void main(String[] args) {//创建手机、相机对象Phone phone = new Phone();Camera camera = new Camera();//创建计算机Computer computer = new Computer();computer.work(phone);//把手机接入到计算机System.out.println("=============");computer.work(camera);//把相机接入到计算机}
}

进一步说明

package com.hspedu.interface_;public class InterfacePolyParameter {public static void main(String[] args) {//接口的多态体现:类似父类引用指向子类对象//接口类型的变量ig1 可以指向 实现了IG接口的类(Monster、Car)的对象实例IG ig1 = new Monster();ig1 = new Car();//继承体现的多态//父类的对象引用指向子类对象本身A02 a02 = new B02();a02 = new C02();}
}
interface IG{}
class Monster implements IG{}
class Car implements IG{}class A02{}
class B02 extends A02{}
class C02 extends A02{}

二、多态数组

package com.hspedu.interface_;public class InterfacePolyArr {public static void main(String[] args) {Usb[] usbs = new Usb[2];usbs[0] = new Phone_();usbs[1] = new Camera_();for (int i = 0; i < usbs.length; i++) {usbs[i].work();//动态绑定机制if(usbs[i] instanceof Phone_){//向上转型之后不能调用子类特有的成员,所以必须再向下转型Phone_ phone_ = (Phone_) usbs[i];phone_.call();}}}
}
interface Usb{void work();
}
class Phone_ implements Usb{@Overridepublic void work() {System.out.println("手机正在工作...");}public void call(){System.out.println("有电话进来了...");}
}
class Camera_ implements Usb{@Overridepublic void work() {System.out.println("相机正在工作...");}
}

三、多态传递

package com.hspedu.interface_;public class InterfacePolyPass {public static void main(String[] args) {//可以指向实现了接口的类的对象实例IH ih = new Teacher();IJ ij = new Teacher();}
}
//接口多态的传递性
interface IJ{ }
interface IH{ }class Teacher implements IH{}

由于Teacher类没有实现接口IJ,所以上述写法是会报错的

 

 但是如果让IH继承IJ,就可以了,这就是接口多态的传递

package com.hspedu.interface_;public class InterfacePolyPass {public static void main(String[] args) {//接口类型的变量可以指向实现了接口的类的对象实例IH ih = new Teacher();//Teacher类没有实现接口IJ,但是IH继承了IJ,也是可以的IJ ij = new Teacher();}
}
//接口多态的传递性
interface IJ{ }
interface IH extends IJ{ }class Teacher implements IH{}

同样的,如果接口IJ中有抽象方法,那么Teacher类也需要去实现这些抽象方法

 

package com.hspedu.interface_;public class InterfacePolyPass {public static void main(String[] args) {//接口类型的变量可以指向实现了接口的类的对象实例IH ih = new Teacher();//Teacher类没有实现接口IJ,但是IH继承了IJ,也是可以的IJ ij = new Teacher();}
}
//接口多态的传递性
interface IJ{void hi();
}
interface IH extends IJ{ }class Teacher implements IH{@Overridepublic void hi() {System.out.println("hi。。。");}
}

三、接口练习

 

package com.hspedu.interface_;public class InterfaceExercise02 {public static void main(String[] args) {new C().pX();}
}
interface A03{int x = 0;
}
class B03 {int x = 1;}
//class C既继承了B03,又实现了A03
//也就是说既可以访问B03中的x,也可以访问A03中的x,所以会报错说x ambiguous
class C extends B03 implements A03 {public void pX() {//接口,接口的属性是 public static final int x = 0;//静态属性可以直接使用 类名.变量名 访问System.out.println(A03.x);//父类的属性,使用super关键字System.out.println(super.x);}}

总结:继承和实现接口的等级是一样的,所以如果父类和接口中的变量名重合的话,在实现类(子类)中访问时就会提示ambiguous(模棱两可)