Java面向接口编程小例子 2
//防火门,防盗门,防火防盗门,门,防盗,防火 interface Dfire { int Dnum = 100; void fire(); } interface Dtheif { int Dnum = 100; void theif(); } abstract class Door { abstract void open(); abstract void close(); } class DfireDoor extends Door implements Dfire { void open() { System.out.println("防火门开了"); } void close() { System.out.println("防火门关了"); } public void fire() { System.out.println("我能防火"); } } class DtheifDoor extends Door implements Dtheif { public void open() { System.out.println("防盗门开了"); } public void close() { System.out.println("防盗门关了"); } public void theif() { System.out.println("我能防盗"); } } class DallDoor extends Door implements Dfire,Dtheif { void open() { System.out.println("防火防盗门开了"); } void close() { System.out.println("防火防盗门关了"); } public void theif() { System.out.println("我能防盗"); } public void fire() { System.out.println("我能防火"); } } class App2 { public static void main(String[] args) { Door d1 = new DfireDoor(); d1.open(); d1.close(); DfireDoor dd1 = new DfireDoor(); dd1.fire(); Door d2 = new DtheifDoor(); d2.open(); d2.close(); Door d3 = new DallDoor(); DallDoor dd3 = new DallDoor(); d3.open(); d3.close(); dd3.theif(); } }
一开始在实现借口的类那里的方法没有加public,导致继承中权限降低,出错
接口中所有的方法与变量都默认是 public 的,在接口中可以不写出来。但在实现类中,如果不明写的话,就变成了 friend 的了,也就是 “包访问权限”。而JAVA又规定,在实现接口或者覆写父类方法时,不能降低父类方法的访问权限,但是可以提高。也就是可以按照 friend protected public 来提高访问权限,但不能按照 public protected friend 来降低访问权限。
然后还有一个问题就是用Door类型的d1去引用DoorDfire型,可以调用Door中重写的open和close方法,但是这样声明的d1虽然引用的是DfireDoor还是不能调用fire接口的fire方法
这个问题看在明天的讲解中能不能解决
-------------------------------------------------------------------------------------------
使用父类类型的引用指向子类的对象是不能去调用接口的方法,因为在父类中也没有声明接口的方法,只声明了将要被子类重写的方法,不能用是正常的。这也是这样声明的弊端,但好处就是兼容性更好,这点在后面会遇到很多。
然后补充点
多态:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。