2009-12-20 51 views
1

A类是抽象的类B扩展类A 现在类的引用可以保持类B的对象,即有关其派生类的抽象类参考保持对象

A aObj = new B(); 

和假设类B具有一些额外的方法.... 像

class A 
{ 
public show(); 
} 
class B extends A 
{ 
public show(){} 
public method1(){} 
private method2(){} 
} 

现在告诉我什么东西变aObj可以从B类 访问它可以访问一切吗?

+0

你的意思是公共无效秀()和抽象类A :) – extraneon

+1

“现在告诉我”。有点粗鲁。这是功课还是这样? – BalusC

回答

2

aObj只能使用show(),因为编译器认为aObj是A类型的,唯一已知的A方法是show()。

如果你知道你确实有一个B可以施放该对象到B:

if (aObj instanceof B.class) { 
    B bObj = (B) aObj; 
    bObj.method1(); //OK 
} else { 
    log.debug("This is an A, but not a B"); 
} 
aObj.show(); 
+0

这意味着...它不能访问method1()和method2()? – shraddha

+1

@shradda,通过A引用调用的'show()'方法在B中实现,因此它('B :: show()')可以调用'method1()'和'method2()',尽管它们是通过A参考不可见。 – rsp

3

aObj只看到public show()方法。如果您将aObj投射到B,则可以访问public method1()public method2()仅仅是B.

3

参考,完整的执行访问,这里的可能性列表:

A aObj = new B(); 
aObj.show(); // Works 
aObj.method1(); // Error 
aObj.method2(); // Error 

并与铸件B:

B bObj = (B)aObj; bObj 
bObj.show(); // Works 
bObj.method1(); // Works 
bObj.method2(); // Works inside bObj, but error otherwise