2012-05-08 4 views
6

Do subclasses inherit private fields?Do Подклассы Наследовать Private переменные экземпляра из Суперклассов

Этот вопрос рассматривается та же проблема, но я не совсем понимаю, как это удовлетворяет (по-видимому) противоречивые ситуации ниже.

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

Говорит, что «подкласс не наследует частные члены родительского класса.»

Это означает, что он не наследует частные переменные экземпляра и частные методы?

Однако, как это работает, если он наследует общедоступный метод доступа от своего родителя? Он возвращает переменную экземпляра, которую она не знает.

Кроме того, в моей книге по вычислительной технике (AP Computer Science A Baron) есть правильный ответ на вопрос, в котором говорится, что «(Подкласс) наследует все переменные частного экземпляра и общедоступные методы доступа из (Суперкласс)».

Разве это не связано с учебником оракула?

Спасибо за вашу помощь

ответ

0

Частные члены также наследуются. Чтобы проверить это, вы можете сделать следующее в суперклассе:

//... 
private String myText = "I'm in the superclass"; 

private void setMyText(String myTextValue) 
{ 
    this.myText = myTextValue; 
} 

public void setMyTextPublic(String myTextValue) 
{ 
    setMyText(myTextValue); 
} 

public String getMyText() 
{ 
    return myText; 
} 
//... 

Создания метода в унаследованном классе:

//... 
public void setMyTextInTheSuperClass(String myTextValue) 
{ 
    System.out.println(getMyText()); 
    setMyTextPublic(myTextValue); 
    System.out.println(getMyText()); 
} 

public void setConstantValueToMyText() 
{ 
    setMyTextInTheSuperClass("I am in the child class"); 
} 
//... 

И позвоните setConstantValueToMyText где-то.

+1

Я все для метасинтатических схем именования, но в определенный момент он может быть запутан. Вероятно, вы должны переименовать 'foobar' в' setFoo' и 'barfoo' в' getFoo'. – Jeffrey

+0

@Jeffrey, вы абсолютно правы, указывая на проблему именования, однако имена в тестовом коде были без всякого смысла, чтобы показать op, который, вероятно, является новичком, о котором мы говорим о любом члене и любой функции, а не о просто устанавливая или получая значения. Однако вы правы, когда говорите об этих словах, которые «не пробуйте это дома, ваши имена должны иметь смысл». –

+0

Я предположил, что большинство людей будет иметь смысл не называть свои методы, как это в реальном коде, но когда я попытался следовать вашему примеру, и я был слегка смущен. Я могу только представить себе, насколько запутанным было бы для новичка. – Jeffrey

2

«Не наследуют» здесь означает, что вы не можете получить доступ к нему. Он по-прежнему существует, просто никак не может взаимодействовать с вами (за исключением вызовов неличных методов суперкласса).

The accepted answer в вопросе, с которым вы связались, объясняет это. Есть ли какая-то частная часть этого объяснения, которая неясна?

+0

Непонятно, почему мой учебник говорит, что это ответ на этот вопрос. – Ian

+1

Это просто означает нечто немного отличающееся от «наследует». – trutheality

+0

Это имеет смысл, спасибо большое. – Ian

10

Аксессуар будет работать нормально. Помните, что аксессор запускается в «контексте» суперкласса и поэтому аксессуар сможет увидеть члена, который скрыт от подклассов.

Что касается учебника, это зависит от вашей точки зрения. Подкласс наследует частных членов в том смысле, что они на самом деле находятся внутри экземпляров подкласса (поэтому они занимают память и т. Д.), Но подкласс не сможет напрямую обращаться к ним.

+3

+1 Да, ваш ответ можно подчеркнуть на примере: Люди унаследовали (если мы верим в теорию эволюции) какой-то хвост от обезьян (часть кости внизу), но они не могут махать хвостом. Они могут смотреть только обезьяны, когда они размахивают своей сказкой или дают им банан, чтобы побудить их погулять их рассказ. –

+0

И как это связано с наследованием частных методов? Они унаследованы, но скрыты? Вы не можете использовать (объект подкласса) (частный метод суперклассов) правильно? Редактировать: Lajos - отличный пример. – Ian

+1

Это связано с тем, что хвост является частным членом обезьян, витиеватая сказка - это частный метод, потому что только у обезьян есть хвосты, и только они могут размахивать хвостами. Однако есть два метода: первый - это общедоступный метод наблюдения хвоста обезьян, который определен в базовом классе (Monkey), и может быть доступен и для людей, которые также могут наблюдать за обезьянами, покачивающими свою историю, в то время как второй - это частный метод предоставления бананов обезьянам, который доступен только для людей, потому что обезьяны эгоистичны и не дают бананов друг другу. –

1

Конечно, когда вы создаете объект класса B, который наследует от класса A если класс A имеет личные вещи, в соответствии с правилами доступа в Java, вы не может иметь доступ к ним, но эти элементы делают существуют в частной памяти, даже в качестве нулевых ссылок, если они являются нулевыми объектами.

В Языковой Спецификации Java, вы можете прочитать:

класс наследует от своего прямого суперкласса и прямых суперинтерфейсов всех nonprivate поля суперкласса и суперинтерфейсов, оба доступны для кода класс и не скрывается объявлением в классе.

A private Поле суперкласса может быть доступно подклассу - , например, если оба класса являются членами одного и того же класса. Тем не менее поле private никогда не наследуется подклассом.

4

Подумайте об этом, как лук. Каждый уровень иерархии - это слой внутри лука. Например, если класс C расширяет класс B, который расширяет класс А, то объект класса C будет выглядеть следующим образом:

Object of Class C

 ------------------------------------------------------------- 
     |               | 
     |     C and it's members      | 
     |               | 
     | ------------------------------------------------  | 
     | |            |  | 
     | |    B and it's members    |  | 
     | | ------------------------------------  |  |            
     | | |   A and it's members  |  |  | 
     | | |         |  |  | 
     | | ------------------------------------  |  |         
     | ------------------------------------------------  | 
     |               | 
     -------------------------------------------------------------    

Таким образом, объект класса С действительно имеет членов В и А . Но он не может получить доступ к закрытым членам B и A.

это, однако, может получить доступ к общим и защищенным членам B и A.

Так публичная функция аксессор B или A позволило бы этот объект класса C в получить доступ к переменной частного экземпляра класс B или класс A "часть" объекта.

1

Если подкласс находится в одном пакете, он наследует частных членов, иначе он наследует только публичные и защищенные члены!