2012-05-11 35 views
0

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

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); 
     } 
    } 
+0

http://stackoverflow.com/questions/1970806/coding-to-interfaces – assylias

+0

如果您取消注释第二行,则会出现语法错误:您无法声明两次变量。 –

+0

@RamyAlZuhouri我认为这个问题是为什么比line2更喜欢line1,所以line1或line2都被注释掉了。 – assylias

回答

0

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

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

欲了解更多详情,请参见http://en.wikipedia.org/wiki/Polymorphism_(computer_science

1

如果你不会需要特定于B任何方法,换句话说,你严格打算使用它作为一个A,这是一个优势,可读性这样说吧。

但最主要的优势来自于光当您使用在方法声明中的一般类型:

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

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

0

在这个例子中,我不认为你可以谈论一个优点(或劣势),因为你的两行代码每个都做了非常不同的事情。

如果变量a的类型是A,那么a.b指的是值为10的字段b

但是,如果你改变aB的类型,然后a.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得到的返回值。现在对a的类型是A还是B的行为没有任何影响。重要的是a引用的对象类型,它始终为B,因此始终具有在B中定义的行为,因此无论如何它都将打印12

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

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