第9章 抽象类和接口

作者: yangsg | 来源:发表于2019-04-04 10:00 被阅读275次

    1. 抽象类

    父类中可以定义出一种行为,但无法描述这个行为的细节。具体的细节可以由各个子类去描述,这个时候父类的这个行为只需要给出定义,不需要进行描述。
    体现在编程中,父类给出方法定义,子类去实现方法内部编码细节。
    这种情况这个类可以理解为是一个抽象类,这种没有细节的方法被称为叫抽象方法
    抽象的关键字: abstract,它可以修饰方法
    抽象类的定义

    public abstract class AbstractTest {
        public abstract void haha(); //haha方法给出定义,无需实现细节
        public void xixi() {
            System.out.println("嘻嘻");
        }
    }
    

    抽象类中不一定有抽象方法
    抽象类中允许出现普通方法
    如果抽象方法要在类中定义,这个类一定是抽象类
    抽象类不能直接创建对象

    我们创建抽象类的目的就是为了作为父类使用
    抽象父类:Bird

    public abstract class Bird {    
        private String color;   
        public Bird(String color) {
            this.color = color;
        }
        public void sleep() {
            System.out.println("鸟类睡觉都是闭眼睛");
        }
        public abstract void eat(); 
    }
    

    实际子类:FlyBird

    public class FlyBird extends Bird {
        public FlyBird(String color) {
            super(color);
        }
        @Override
        public void eat() {
            System.out.println("随便吃");  
        }
    }
    

    测试类

    public class Test {
        public static void main(String[] args) {
            FlyBird fb = new FlyBird("");
            fb.eat();
            
            Bird b = new FlyBird("");
            b.eat();
        }
    }
    

    子类在继承了抽象父类后,必须对抽象方法进行实现。除非子类也是抽象类。

    2. 接口

    接口主要用于描述现实世界中拥有同种行为的事物。比如飞机,鸟,UFO...可能都会飞,但是是完全不同的类。
    可以将接口理解为是一种特殊抽象类(没有属性只有抽象方法),实际上接口在官方文档的定义中不是类。
    接口的特征:

    • 关键字是interface,不是class
    • 接口中定义的方法,全部都是公有抽象方法,可以省略public和abstract关键字。虽然省略,方法也被认为是公有抽象的
    • 接口之间可以互相继承,且是多继承(extends)
    • 类可以实现接口,且是多实现(implements)

    接口一般命名为XXXXable,XXXX一般是一个动词,able在英文中表示“可能性”。XXXXable可以翻译为“有XXXX这个动作的可能性”
    接口的声明

    public interface Flyable {
        public abstract void fly();
    }
    

    接口的继承,SwimAndFlyAble继承了 Swimable和Flyable接口中的方法,同时自己拓展了drink和run方法

    public interface SwimAndFlyAble extends Swimable, Flyable {
        public void drink();
        public void run();
    }
    

    类实现接口

    public class SuperBird implements SwimAndFlyAble {
    
        @Override
        public void swim() {}
        @Override
        public void fly() {}
        @Override
        public void drink() {}
        @Override
        public void run() {}
    }
    

    类既继承父类又实现接口,eat方法从bird中继承来的,fly方法从接口中实现来的

    public class FlyBird extends Bird implements Flyable{
        @Override
        public void eat() {
            System.out.println("随便吃");
        }
        @Override
        public void fly() {
            System.out.println("随便飞");  
        }
    }
    

    接口也可以作为上溯造型的多态使用,Swimable s表示可以在水上游泳的事物。SwimBird实现了Swimable 接口,Ship也实现了这个接口

    public class Test2 {
        
        public static void test(Swimable s) {
            s.swim();
        }
        public static void main(String[] args) {
            SwimBird s = new SwimBird("");
            Ship p = new Ship();
            
            test(s);
            test(p);
        }
    }
    

    总结:接口与类之间的关系,接口与接口之间的关系,类与类之间的关系

    接口
    单继承 多实现
    接口 X 多继承

    笔试面试题: 接口与抽象类的区别?

    • 抽象类是class,接口是interface,不是一种东西
    • 抽象类中可以有抽象方法,也可以有普通方法;接口中只能有抽象方法
    • 抽象类中可以有属性;接口中也可以有属性,但接口中的属性必须是常量
    • 抽象类只能被单继承,接口可以被多实现

    相关文章

      网友评论

        本文标题:第9章 抽象类和接口

        本文链接:https://www.haomeiwen.com/subject/qabxiqtx.html