2009-12-20 1 views
1

класса А является абстрактным и класс В расширяет класса А Теперь класс Ссылка может содержать объект класса B, то есть, связанные с абстрактным эталонным классом удержания объекта его производного класса

A aObj = new B(); 

и предположим, класс В имеет некоторые дополнительные методы .... как

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

теперь скажите мне, что вещи переменной aObj может получить доступ из класса в она может получить доступ ко всему?

+0

Вы имеете в виду публичные недействительных шоу(), и абстрактный класс A :) – extraneon

+1

«now tell me». Немного грубо. Это домашнее задание? – 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

это означает ... это не могу метод доступа1() и method2()? – shraddha

+1

@shradda, метод 'show()', вызываемый посредством ссылки A, реализован в 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 
Смежные вопросы