kha*_*han 70 java oop polymorphism java-ee
当我开始寻找多态性的好处时,我在这里找到了这个问题.但在这里我无法找到答案.让我告诉我想找到什么.这里我有一些课程:
class CoolingMachines{
    public void startMachine(){
        //No implementationion
    }
    public void stopMachine(){
        //No implementationion
    }
}
class Refrigerator extends CoolingMachines{
    public void startMachine(){
        System.out.println("Refrigerator Starts");
    }
    public void stopMachine(){
        System.out.println("Refrigerator Stop");
    }
    public void trip(){
        System.out.println("Refrigerator Trip");
    }
}
class AirConditioner extends CoolingMachines{
    public void startMachine(){
        System.out.println("AC Starts");
    }
    public void stopMachine(){
        System.out.println("AC Stop");
    }
}
public class PolymorphismDemo {
    CoolingMachines cm = new Refrigerator();
    Refrigerator rf = new Refrigerator();
}
现在我在Demo类中创建了两个对象,并且是对它的引用Refrigerator.我完全理解从rf对象我可以调用trip()方法Refrigerator,但该方法将被隐藏为cm对象.现在我的问题是为什么我应该使用多态或我为什么要使用
CoolingMachines cm = new Refrigerator();
当我没事的时候
Refrigerator rf = new Refrigerator();
多态对象的效率是好还是重量轻?这两个对象的基本目的和区别是什么?有什么区别cm.start();和rf.start()?
pgr*_*ras 71
处理列表时很有用......一个简短的例子:
List<CoolingMachines> coolingMachines = ... // a list of CoolingMachines 
for (CoolingMachine current : coolingMachines) {
    current.start();
}
或者当您想允许方法使用任何子类时 CoolingMachines
Jon*_*eet 58
如果您对了解具体课程感到满意,那就没有任何好处.但是,在许多情况下,您希望能够编写只知道基类或接口的代码.
例如,Iterables在Guava中查看- 这是很多方法(大多数)不关心Iterable正在使用的实现.您是否真的希望每个实现单独使用所有代码?
在可以编写抽象基类或接口的地方,您可以在以后使用共享相同公共API但可能具有不同实现的其他实现.即使您只需要单个生产实现,您也可能需要其他实现进行测试.(这种适用的程度在很大程度上取决于所讨论的课程.)
Nav*_*een 29
因为以后如果要使用AirConditioner而不是Refrigerator冷却,那么只需要更改的代码就是CoolingMachines cm = new AirConditioner();
Sim*_*ser 17
你想要使用的原因
CoolingMachines cm = new Refrigerator();
是你以后可以轻松使用不同的CoolingMachines.您只需要更改那一行代码,其余代码仍然可以工作(因为它只使用CoolingMachines比特定机器更通用的方法,例如a Refrigerator).
因此,对于特定的实例Refrigerator,调用cm.start();和rf.start()工作方式相同,但cm也可能是不同的CoolingMachines对象.并且该对象可以具有不同的实现start().
小智 7
使用多态来进行方法重写和方法重载.其他类方法在不同的类中使用,然后有两个选项:第一个方法继承,第二个方法重写.这里扩展接口:使用它们,或者实现方法:逻辑写入它们.多态性用于方法,类继承.
有什么区别cm.start();和rf.start();?
是的,两者都是彼此完全不同的对象.不要创建接口对象,因为Java不支持接口对象.为接口创建第一个对象,为Refrigerator类创建第二个对象.第二个目标.
对问题的一般部分(我为什么要使用多态?)的最一般的答案是多态性实现了一些关键的面向对象设计原则,例如:
代码重用:通过将所有"冷却机器"共有的代码放入冷却机器中,您只需编写一次该代码,对该代码的任何编辑都会立即流下.
抽象:人类的大脑只能跟踪这么多东西,但他们擅长类别和层次结构.这有助于了解大型计划中发生的事情.
封装:每个类隐藏它正在做的事情的细节,并且只是在基类的接口上构建.
关注点分离:很多面向对象的编程都是关于分配责任的.谁将负责这一点?专门的问题可以在子类中进行.
因此,多态性只是更大的oo图片的一部分,并且使用它的原因有时只有在你尝试"真正的"编程时才有意义.