创建一个门的抽象父类,继承这个类的子类,必须继承他所有的方法
package com.qf.day11today14.work3;
public abstract class Door {
public abstract void open();
public abstract void close();
}
创建两个接口
public interface CardOpenDoor {
public abstract void cardOpen();
}
package com.qf.day11today14.work3;
/**
- 刷脸功能接口
*/
public interface FaceOpenDoor {
public abstract void faceOpen();
}
创建多个子类,有单纯继承父类的,有继承了父类继承了一个或多个接口。
public class IronDoor extends Door{
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("铁门用钥匙开门");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("铁门用钥匙关门");
}
}
/**
- 防盗门,继承了门的方法并覆盖它,继承了刷卡的接口并实现它。
*/
public class SecurityDoor extends Door implements CardOpenDoor{
@Override
public void cardOpen() {
System.out.println("防盗门刷卡开门");
}
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("用钥匙开防盗门");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("用钥匙关防盗门");
}
}
/**
- 超级防盗门类,继承门的方法并覆盖,继承了刷卡开门和刷脸开门接口
*/
public class SuperSecurityDoor extends Door implements CardOpenDoor,FaceOpenDoor {
@Override
public void faceOpen() {
// TODO Auto-generated method stub
System.out.println("超级防盗门刷脸开门");
}
@Override
public void cardOpen() {
// TODO Auto-generated method stub
System.out.println("超级防盗门刷卡开门");
}
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("超级防盗门用钥匙开门");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("超级防盗门用钥匙关门");
}
}
/**
- 木门类,单纯继承门的方法并重写
*/
public class WoodDoor extends Door{
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("木门用脚开门");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("木门用脚勾关");
}
}
创建一个使用类人,人有四个方法,正常开门、正常关门、刷卡开门、刷卡关门
/**
- 人使用门
*/
public class People {
public void openDoor(Door door) {
door.open();
}
public void closeDoor(Door door) {
door.close();
}
//刷脸开门的方法只能传入继承了FaceOpenDoor接口的类
public void faceOpenDoor(FaceOpenDoor door) {
door.faceOpen();
}
//刷卡开门的方法只能传入继承了CardOpenDoor接口的类
public void cardOpenDoor(CardOpenDoor superSecurityDoor3) {
superSecurityDoor3.cardOpen();;
}
}
测试类
/**
- 抽象类和接口的组合使用,关于门的
*/
public class Test {
public static void main(String[] args) {
Door woodDoor1 = new WoodDoor();//创建一个以父类声明指向子类类型的变量
Door ironDoor1 = new IronDoor();//创建一个以父类声明指向子类类型的变量
Door superSecurityDoor1 = new SuperSecurityDoor();//创建一个以父类声明指向子类类型的变量
Door securityDoor1 = new SecurityDoor();//创建一个以父类声明指向子类类型的变量
FaceOpenDoor superSecurityDoor2 = new SuperSecurityDoor();//创建一个以接口声明指向继承了这个接口子类的变量
CardOpenDoor superSecurityDoor3 = new SuperSecurityDoor();//创建一个以接口声明指向继承了这个接口子类的变量
CardOpenDoor securityDoor2 = new SecurityDoor();//创建一个以接口声明指向继承了这个接口子类的变量
CardOpenDoor securityDoor3 = new SecurityDoor();//创建一个以接口声明指向继承了这个接口子类的变量
SecurityDoor seD = null;
if (securityDoor3 instanceof SecurityDoor) {//判断securityDoor3的本身类型是不是SecurityDoor。
seD = (SecurityDoor) securityDoor3; // 把securityDoor强转回本身类型
//接口声明的变量能转回本身类型
}
People people = new People();
people.cardOpenDoor(seD);//传入一个SecurityDoor类声明的Security变量,该变量继承了CardOpenDoor接口,所以以接口声明的形参能接受它
people.closeDoor(seD);//传入一个子类对象用父类接受。
people.openDoor(woodDoor1);//传入一个子类对象用父类接受。
people.closeDoor(woodDoor1);//传入一个子类对象用父类接受。
people.cardOpenDoor(securityDoor2);
people.closeDoor(securityDoor1);
people.cardOpenDoor(new SuperSecurityDoor());
people.closeDoor(new SuperSecurityDoor());
}
}
继承和接口的多态总结:
1.父类做形参能传入继承了这个父类的子类做为实参。
2.同理方法中返回子类对象也能用父类变量来接受。
3.接口类做为参数只能传入继承了这个接口的子类。
4.接口中的方法默认为是公开抽象的,属性默认为是公开静态不可变的。
5.接口仅可调用接口中所声明的方法,而不可调用实现类中独有的方法。
6.用父类或接口做引用类型时,只能使用父类或接口中的方法,子类中的方法不可以。