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方法

这个问题看在明天的讲解中能不能解决

-------------------------------------------------------------------------------------------

使用父类类型的引用指向子类的对象是不能去调用接口的方法,因为在父类中也没有声明接口的方法,只声明了将要被子类重写的方法,不能用是正常的。这也是这样声明的弊端,但好处就是兼容性更好,这点在后面会遇到很多。

然后补充点

多态:

一、使用父类类型的引用指向子类的对象; 
二、该引用只能调用父类中定义的方法和变量; 
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用) 
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256674.html