• java 中的多重继承


    Java中的接口不仅仅是一种更纯粹的抽象类,它的目标比这更高。因为接口是根本没有任具体实现的。也就是说,没有任何与接口相关的存储;因此,也就无法阻止多个接口的组合。这一点是很有价值的,因为你有时候需要去表示“一个X是一个a和一个b以及一个c”。在C++中,组合多个类的接口的行为被称作为多重继承。它可能会使你背负很沉重的包袱,因为每个类都有一个具体实现。在java中,你可以执行相同的行为,但是只有一个类可以有具体的实现;因此通过组合多个接口,c++的问题不会在java中发生:

    KXHVVHNW(%300RZ0(Q3PQCD

    下面展示一个具体类组合数个接口之后产生的一个新类:

    package interfaces;
    
    interface CanFight{
        void fight();
    }
    
    interface CanSwim{
        void swim();
    }
    
    interface CanFly{
        void fly();
    }
    
    interface CanClimb{
        void climb();
    }
    class ActionCharacter{
        public void fight(){
            System.out.println(" can fight");
        };
    }
    
    class Hero extends ActionCharacter
    implements CanFight, CanSwim, CanFly,CanClimb{
        public void swim(){
            System.out.println("hero can swim");
        };
        public void fly(){
            System.out.println("hero can fly");
        };
        public void climb(){
            System.out.println("hero can climb");
        }
    }
    
    public class Adventure {
        public static void t(CanFight x){x.fight();}
        public static void u(CanSwim x){x.swim();}
        public static void v(CanFly x){x.fly();}
        public static void f(CanClimb x){x.climb();}
        public static void w(ActionCharacter x){x.fight();}
        public static void main(String [] args){
            Hero h = new Hero();
            t(h);
            u(h);
            v(h);
            w(h);
            f(h);
        }
        
    }
    运行结果:
    can fight
    hero can swim
    hero can fly
     can fight
    hero can climb

    可以看到,Hero组合了具体类ActionCharacater和接口CanFight,CanSwim,CanFly和CanClimb。当通过这种方式将一个具体的类和多个接口组合在一起时,这个具体的类必须放在前面,后面跟着的才是接口,否则编译器出错。

    注意,CanFight接口和ActionCharacter类中的fight(方法的特征签名一样,而且,在Hero中并没有提供fight()的定义。可以扩展接口,但是得到的只是另一个接口。当要创建对象时,所有的定义首先必须存在。即使Hero没有显示的提供fight()的定义,其定义也因ActionCharacter而随之而来,这样就使得创建Hero对象成为可能。

    前面的例子所展示的就是使用接口的核心原因:为了能够向上转型为多个基类型(以及由此带来的灵活性)。

    然而,使用接口的第二个原因却是防止客户端程序员创建该类对象,并确保这仅仅是建立一个接口。这带来了一个问题:我们应该使用接口还是抽象类?如果要创建不带任何方法定义和成员变量的基类,那么第一选择应该是选择一个接口而不是抽象类。若果知道某事物应该成为一个基类,那么第一选择应该是使它成为一个接口。

  • 相关阅读:
    Python中List详解
    编程语言的发展史及变量的概念
    Python的print()函数详解
    计算机核心基础
    vc++如何创建窗口
    vc++如何创建程序-设置断点-函数的覆盖,c++的多态性
    vc++如何创建程序-设置断点-函数的覆盖,c++的多态性
    vc++如何创建程序-构造函数
    vc++如何创建程序-构造和继承
    vc++如何创建程序-函数的重载
  • 原文地址:https://www.cnblogs.com/fxyfirst/p/3778436.html
Copyright © 2020-2023  润新知