Вопрос по java, inheritance – Подклассы наследуют переменные частного экземпляра от суперклассов

7

Подклассы наследуют частные поля?

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

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

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

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

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

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

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

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

Ваш Ответ

6   ответов
2

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

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

Это просто означает что-то немного отличающееся от «наследует».
Это имеет смысл, большое спасибо. Ian
Что не ясно, так это то, почему мой учебник говорит, что это ответ на этот вопрос. Ian
1

B что наследует от классаA если классA имеет личные вещи, согласно правилам доступа в Java, выcan not have access them, но эти элементы существуют в частной памяти, даже как нулевые ссылки, если они были нулевыми объектами.

ВThe Java Language Specification, ты можешь читать:

A class inherits from its direct superclass and direct superinterfaces all the nonprivate fields of the superclass and superinterfaces that are both accessible to code in the class and not hidden by a declaration in the class.

A private field of a superclass might be accessible to a subclass - for example, if both classes are members of the same class. Nevertheless, a private field is never inherited by a subclass.

5

имер, если класс C расширяет класс B, который расширяет класс A, тогда объект класса C будет выглядеть так:

Object of Class C

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

Итак, объект класса C имеет члены B и A. Но он не может получить доступ к закрытым членам B и A.

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

Таким образом, общедоступная функция доступа B или A позволит этому объекту класса C получить доступ к закрытой переменной экземпляра класса B или класса A & quot;part& Quot; объекта.

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 где-нибудь.

Справедливо, код изменен. Может быть, это более полезно сейчас.
Да ты прав. Если вы попытаетесь манипулировать myText непосредственно из унаследованного класса, ваш код не скомпилируется.
Я все для метасинтаксических схем именования, но в определенный момент это может стать запутанным. Вы должны вероятно переименоватьfoobar вsetFoo а такжеbarfoo вgetFoo.
Я предполагал, что у большинства людей будет смысл не называть свои методы такими же в реальном коде, но когда я попытался последовать вашему примеру, я был слегка растерян. Я могу только представить, насколько запутанным это будет для начинающего.
@Jeffrey, вы абсолютно правы, указав на проблему с именами, однако названия в тестовом коде не имели никакого смысла, чтобы показать операционку, которая, вероятно, новичок в том, что мы говорим о любом члене и любой функции, а не только установка или получение значений. Однако вы правы, когда говорите об этих именах, что «не пытайтесь делать это дома», ваши имена должны иметь смысл ».
10

что средство доступа работает в & quot; контексте & quot; суперкласса и, таким образом, средство доступа сможет видеть элемент, который скрыт от подклассов.

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

+1 Да, ваш ответ можно подчеркнуть на примере: люди унаследовали (если мы верим в теорию эволюции) какой-то хвост от обезьян (часть кости внизу), но они не могут вилять хвостом. Они могут только наблюдать за обезьянами, когда они виляют свою историю, или давать им банан, чтобы поощрить их вилять свою историю.
А вилять хвостом это частный метод обезьяны? И поэтому не наследуется человеком? Ian
Это связано с тем, что хвост - это частный член обезьян, виляние в сказке - частный метод, потому что только обезьяны имеют хвосты, и только они могут вилять своими хвостами. Тем не менее, есть два метода: первый - публичный метод наблюдения за хвостом обезьян, который определен в базовом классе (обезьяна) и может быть доступен также для людей, которые также могут наблюдать за обезьянами, махающими своей историей, в то время как второй - это частный метод раздачи бананов обезьянам, который доступен только для людей, потому что обезьяны эгоистичны и не дают бананы друг другу.
И как это связано с наследованием частных методов? Они унаследованы, но скрыты? Вы не можете использовать (объект подкласса). (Закрытый метод superclsas), верно? редактировать: Лайос, это отличный пример. Ian
Я также дал ответ, где вы можете проверить это.
1

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

Похожие вопросы