//防火门,防盗门,防火防盗门,门,防盗,防火
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方法
这个问题看在明天的讲解中能不能解决
-------------------------------------------------------------------------------------------
使用父类类型的引用指向子类的对象是不能去调用接口的方法,因为在父类中也没有声明接口的方法,只声明了将要被子类重写的方法,不能用是正常的。这也是这样声明的弊端,但好处就是兼容性更好,这点在后面会遇到很多。
然后补充点
多态:
一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。