Java编程中的对象引用

时间:2012-05-11 07:42:21

标签: java

我想知道为子类创建对象但是分配A类ref而不是分配B类ref的优势。它显示在代码

下面的第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 个答案:

答案 0 :(得分:1)

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

但是,当您在方法声明中使用常规类型时,主要优势就会浮出水面:

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

如果你没有充分的理由在这里使用B,那么你会不必要地削弱你的方法。它可以适用于任何A,但它仅适用于B

答案 1 :(得分:0)

尝试阅读:Polymorphism

答案 2 :(得分:0)

在你的简短例子中,没有真正的优势。 但总的来说,你的问题是多态性有什么用?

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

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

答案 3 :(得分:0)

在那个例子中,我认为你不能谈论优势(或劣势),因为你的两行代码各自做了一些非常不同的事情。

如果变量a的类型为A,则a.b会引用值为b的字段10

但是,如果您将a的类型更改为B,那么a.b会引用一个完全不同的字段,即在B内声明的字段,其值为{{1} }}

如果12是一个方法,那么在b中声明的方法将“覆盖”在B中声明的方法,这是一种非常不同的情况。 e.g。

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的类型是a还是A的行为没有区别。重要的是B引用的对象类型,始终为a,因此始终具有B中定义的行为,因此无论如何都会打印B。 / p>

这样做的好处是你可以拥有一系列物品(例如各种车辆),它们可以是汽车,船只,火车等的混合体。每种都有自己的12方法实现,所以你可以用同样的方式对待它们。

虽然通常在start而不是interface中定义此类方法更为明确。 class车辆没有通用的方法,所以没有理由让基类具有无意义的start实现。相反,你只需使用一个接口来声明方法的“形状”而不给它任何实现。