使用接口和类的多态性

Swa*_*rma 5 java polymorphism

下面编码的多态性有什么区别吗?基本上方法调用的绑定有区别吗?

多态类型 1:

class A
{
    public void method()
    {
        // do stuff
    }
}

class B extends A
{
    public void method()
    {
        // do other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我用 A 做 B 的事情

A a =  new B();
a.method();
Run Code Online (Sandbox Code Playgroud)

多态类型2:

public interface Command
{
    public void execute();
}

public class ReadCommand implements Command
{
    public void execute()
    {
        //do reading stuff
    }
}

public class WriteCommand implements Command
{
    public void execute()
    {
        //do writing stuff
    }
}

public class CommandFactory
{
    public static Command getCommand(String s)
    {
        if(s.equals("Read"))
        {
            return new ReadCommand();
        }
        if(s.equals("Write"))
        {
            return new WriteCommand();
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我使用命令工厂:

Command c = CommandFactory.getCommand("Read");
c.execute();
Run Code Online (Sandbox Code Playgroud)

我的问题是:上述两种多态性有什么区别。我知道两者都是运行时多态性的例子,但是 [关于方法的绑定] 有什么区别,或者有什么其他区别吗?

Jon*_*eet 2

我想两者之间有一个区别

Command c = CommandFactory.getCommand("Read");
Run Code Online (Sandbox Code Playgroud)

A a =  new B();
Run Code Online (Sandbox Code Playgroud)

...在第一种情况下,您别无选择只能使用接口(或仅使用Object),因为赋值运算符右侧的表达式的类型为Command

在第二种情况下,您故意选择将结果分配给类型为 的变量A,即使您可以编写

B b = new B();
Run Code Online (Sandbox Code Playgroud)

这实际上只是设计选择的差异 - 它不会影响调用c.execute()a.execute()实际的行为方式。