美文网首页
接口的继承与抽象类

接口的继承与抽象类

作者: SingleDiego | 来源:发表于2018-03-14 15:59 被阅读20次

    接口继承

    接口继承(inheritance)与类继承很类似,就是以被继承的 interface 为基础,增添新增的接口方法原型。比如,我们以 Cup 作为原 interface,在继承 Cup 的基础上,定义一个新的有刻度的杯子的接口 MetricCup

    interface Cup 
    {
        void addWater(int w);
        void drinkWater(int w);
    }
    
    interface MetricCup extends Cup
    {
        int WaterContent();
    }
    

    继承后的 MetricCup 增添了一个新的方法原型 WaterContent(),这个方法返回一个整数(水量)。




    interface 的多重继承

    在 Java 类的继承中,一个衍生类只能有一个基类。也就是说,一个类不能同时继承多于一个的类。在 Java 中,interface 可以同时继承多于一个 interface,这叫做 多重继承(multiple inheritance)。

    我们创建一个 MusicCup 的接口。它既有 Cup 接口,又有 Player 接口,并增加一个 display() 方法原型:

    interface Cup 
    {
        void addWater(int w);
        void drinkWater(int w);
    }
    
    interface Player
    {
        void play();
    }
    
    interface MusicCup extends Cup, Player 
    {
        void display();
    }
    

    如何使用 interface,见实施接口一章。




    抽象类

    在生活中,我们会有一些很抽象的概念。这些抽象的概念往往是许多类的集合,比如:

    • 粮食 (可以是玉米、小麦、大米)
    • 图形 (可以是三角形、圆形、正方形)

    再比如,我们之前举出了例子:人类 (可以是男人、女人)

    在组织这样的关系时,我们可以使用继承,比如:

    根据我们的常识:

    Food 类的对象的说法是抽象的。这样一个对象应该是属于 Corn, Rice, Wheat 子类中的一个,世界上不存在一种叫 Food 的食物。

    Food 类有 eat() 方法(食物可以吃)。然而,这样的一个动作是抽象的。粮食的具体吃法是不同的。比如 Corn 需要剥皮吃,Wheat 要磨成面粉吃。我们需要在每个子类中覆盖 Food 类的 eat() 方法。

    Java 中提供了 抽象类(abstract class)的语法,用于说明类及其方法的抽象性。用关键字 abstract 来表示:

    abstract class Food 
    {
        // 抽象方法
        public abstract void eat();
        
        public void happyFood();
        {
            System.out.println("Good! Eat Me!");
        }
    }
    

    类中的方法可以声明为 abstract,比如上面的 eat()。这时,我们不需要具体定义方法,只需要提供该方法的原型。这与接口类似。当我们在比如 Corn 类中继承该类时,才需要提供 eat() 方法的具体定义。

    类中的另一个方法 happyFood() 并不是抽象方法。

    当一个类中出现 abstract 方法时,这个类的声明必须加上 abstract 关键字,否则 Java 将报错。一个 abstract 类不能用于创建对象。




    抽象类的继承

    我们可以像继承类那样继承一个抽象类。我们必须用完整的方法定义,来覆盖抽象类中的抽象方法,否则,衍生类依然是一个抽象类。

    抽象类的定义中可以有数据成员。数据成员的继承与正常类的继承相同。

    abstract class Food 
    {
        public abstract void eat();
    
        public void happyFood()
        {
            System.out.println("Good! Eat Me!");
        }
    }
    
    
    class Corn extends Food
    {
        // 覆盖抽象的 eat() 方法
        public void eat()
        {
            System.out.println("eat corn");
        }
    }
    
    
    public class Test
    {
        public static void main(String[] args)
        {
            Corn aCorn = new Corn();
            aCorn.eat();
            aCorn.happyFood();                     
        }
    }
    

    输出结果:

    eat corn
    Good! Eat Me!
    

    相关文章

      网友评论

          本文标题:接口的继承与抽象类

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