связанный с абстрактной ссылкой на класс, содержащий объект его производного класса - PullRequest
1 голос
/ 20 декабря 2009

класс A является абстрактным, а класс B расширяет класс A теперь ссылка на класс A может содержать объект класса B, то есть

A aObj = new B();

и предположим, что в классе B есть несколько дополнительных методов .... как

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

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

Ответы [ 3 ]

3 голосов
/ 20 декабря 2009

aObj видит только метод public show(). Если вы разыгрываете aObj на B, вы можете получить доступ к public method1(). public method2() доступен только для реализации B.

3 голосов
/ 20 декабря 2009

Для справки и полноты, вот список возможностей:

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

А с литьем на Б:

B bObj = (B)aObj; bObj
bObj.show(); // Works
bObj.method1(); // Works
bObj.method2(); // Works inside bObj, but error otherwise
2 голосов
/ 20 декабря 2009

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(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...