接口多态加父类抽象多态的使用,用门做例子理解。

创建一个门的抽象父类,继承这个类的子类,必须继承他所有的方法
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.用父类或接口做引用类型时,只能使用父类或接口中的方法,子类中的方法不可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值