0

我想知道在为子类创建对象但分配 A 类引用而不是分配 B 类引用之间的优势。这显示在代码下面的第 1 行、第 2 行中

 class A
    {
         int b=10;
     }
    class B extends A
    { 
         int b=12;

        }
    class Test
    {
         public static void main(String[] args)
         {
               A a=new B(); //line1 
               //B a=new B();//line2
            System.our.println(a.b);
         }
    }
4

4 回答 4

1

如果您不需要任何特定于 的方法B,换句话说,您将严格将其用作A,那么这样说明可读性是一个优势。

但是,当您在方法声明中使用通用类型时,主要优势就会显现出来:

public String resolveName(A a) { ... }

如果您B无缘无故地在这里使用,那么您将不必要地削弱您的方法。它可能适用于任何人A,但它只适用于B.

于 2012-05-11T07:52:51.230 回答
0

尝试阅读:多态性

于 2012-05-11T07:49:32.337 回答
0

在您的简短示例中,没有真正的优势。但总的来说,您的问题是多态性有什么好处?

答案可以追溯到 OOP 方法论的需要。简而言之,它使您能够从用法中封装和抽象实现,并且可以帮助您将来替换实现而无需更改用法。

有关更多详细信息,请参阅http://en.wikipedia.org/wiki/Polymorphism_(computer_science )

于 2012-05-11T07:50:28.190 回答
0

在那个例子中,我认为您不能谈论优势(或劣势),因为您的两行代码各有不同的作用。

如果变量的类型aA,则a.bb具有值的字段10

但是,如果您将 的 类型更改为aBa.b指的是完全不同的字段,即在内部声明的字段,B其值为12

如果相反b是一种方法,那么在中声明的方法B将“覆盖”在中声明的方法A,这是一种非常不同的情况。例如

class A
{
     public int b() { return 10; };
}
class B extends A
{ 
     public int b() { return 12; }
}

调用代码是:

A a=new B(); //line1 
//B a=new B();//line2
System.our.println(a.b());

也就是我们调用方法b来获取返回值。现在无论aA还是的类型都对行为没有影响B。重要的是所a引用的对象的类型,它总是B并且因此总是具有在 中定义的行为,因此无论如何B它都会打印。12

这样做的好处是你可以有一个对象的集合(例如各种车辆),它们可以是汽车、船、火车等的混合体。每个都有自己的start方法实现,所以你可以把它们全部处理同样的方法。

尽管通常在 a 中定义此类方法interface比在 a中更清晰class。车辆没有通用start的方法,因此没有理由拥有一个对start. 相反,您只需使用接口来声明方法的“形状”,而不给它任何实现。

于 2012-05-11T07:56:22.740 回答