Наследуются ли приватные поля java

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

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

Я ответил «Нет», потому что мы не можем получить к ним доступ «обычным способом ООП». Но интервьюер считает, что они наследуются, потому что мы можем получить доступ к таким полям косвенно или с помощью отражения, и они все еще существуют в объекте.

После того, как я вернулся, я нашел следующую цитату в Javadoc:

Частные Члены в Суперклассе

Подкласс не наследует частные члены своего родительского класса.

Знаете ли вы какие-либо аргументы для мнения интервьюера?

21 ответ

Большая часть беспорядка в вопросе / ответах здесь окружает определение Наследования.

Очевидно, что, как объясняет @DigitalRoss, ОБЪЕКТ подкласса должен содержать закрытые поля своего суперкласса. Как он утверждает, отсутствие доступа к частному члену не означает, что его там нет.

Тем не мение. Это отличается от понятия наследования для класса. Как и в случае с Java, где существует вопрос семантики, арбитром является спецификация языка Java (в настоящее время 3-е издание).

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

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

Ответ — нет. Они этого не делают. ОБЪЕКТЫ подклассов содержат частные поля своих суперклассов. У самого подкласса нет НИКАКОГО ПОНИМАНИЯ частных полей своего суперкласса.

Это семантика педантичного характера? Да. Это полезный вопрос для интервью? Возможно нет. Но JLS устанавливает определение для мира Java, и это делает это (в данном случае) однозначно.

EDITED (удалена параллельная цитата из Bjarne Stroustrup, которая из-за различий между java и C++, вероятно, только добавляет путаницы. Я позволю своему ответу остановиться на JLS:)

да

Важно понимать, что хотя есть два класса, есть только один объект.

Так что, да, конечно, он унаследовал частные поля. Они, по-видимому, необходимы для правильной функциональности объекта, и хотя объект родительского класса не является объектом производного класса, экземпляр производного класса в основном определенно является экземпляром родительского класса. Это не может быть очень хорошо без всех полей.

Нет, вы не можете получить к ним прямой доступ. Да, они наследуются. Они должны быть.

«Нет»

Ну, я думаю, мы все чему-то научились. Поскольку в JLS возникла точная «не унаследованная» формулировка, правильно ответить «нет». Поскольку подкласс не может получить доступ или изменить частные поля, то, другими словами, они не наследуются. Но на самом деле существует только один объект, он действительно содержит закрытые поля, и поэтому, если кто-то неправильно использует JLS и учебное пособие, будет довольно сложно понять ООП, объекты Java и то, что на самом деле происходит.

Обновление для обновления:

Противоречие здесь связано с фундаментальной двусмысленностью: что именно обсуждается? Объект? Или мы в каком-то смысле говорим о самом классе? При описании класса в отличие от объекта допускается много возможностей. Таким образом, подкласс не наследует частные поля, но объект, который является экземпляром подкласса, безусловно, содержит частные поля.

Читайте также:  Linux apache mysql php сервер

Нет. Частные поля не наследуются. и поэтому было создано изобретение Protected. Это по замыслу. Полагаю, это оправдывало существование защищенного модификатора.

Теперь подходит к контексту. Что вы подразумеваете под унаследованным — если он есть в объекте, созданном из производного класса? Да, это.

Если вы имеете в виду, может ли это быть полезным для производного класса. Ну нет.

Теперь, когда вы переходите к функциональному программированию, приватное поле суперкласса не наследуется для подкласса осмысленным образом. Для подкласса приватное поле суперкласса такое же, как приватное поле любого другого класса.

Функционально это не наследуется. Но в идеале это так.

Хорошо, только что посмотрел учебник Java, они цитируют это:

Частные Члены в Суперклассе

Подкласс не наследует частные члены своего родительского класса. Однако, если суперкласс имеет открытые или защищенные методы для доступа к своим закрытым полям, они также могут использоваться подклассом.

Я согласен, что поле есть. Но подкласс не получает никаких привилегий для этого частного поля. Для подкласса приватное поле такое же, как и любое приватное поле любого другого класса.

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

Это зависит от вашего определения «наследовать». У подкласса все еще есть поля в памяти? Определенно. Может ли он получить к ним доступ напрямую? Нет. Это просто тонкости определения; дело в том, чтобы понять, что на самом деле происходит.

Я продемонстрирую концепцию с кодом. Подклассы АКТУАЛЬНО наследуют частные переменные суперкласса. Единственная проблема заключается в том, что они недоступны для дочерних объектов, если вы не предоставите общедоступные методы получения и установки для частных переменных в суперклассе.

Рассмотрим два класса в пакете Dump. Ребенок расширяет Родителя.

Если я правильно помню, дочерний объект в памяти состоит из двух областей. Один является только родительской частью, а другой — только дочерней. Ребенок может получить доступ к закрытому разделу в коде своего родителя только через открытый метод в родителе.

Подумай об этом так. У отца Бората Болтока есть сейф, в котором находится 100000 долларов. Он не хочет делиться своей «приватной» переменной безопасно. Итак, он не предоставляет ключ от сейфа. Борат наследует сейф. Но что хорошего в том, что он не может даже открыть это? Если бы только его папа предоставил ключ.

package Dump; public class Parent < private String reallyHidden; private String notReallyHidden; public String getNotReallyHidden() < return notReallyHidden; >public void setNotReallyHidden(String notReallyHidden) < this.notReallyHidden = notReallyHidden; >>//Parent 
package Dump; public class Child extends Parent < private String childOnly; public String getChildOnly() < return childOnly; >public void setChildOnly(String childOnly) < this.childOnly = childOnly; >public static void main(String [] args)< System.out.println("Testing. "); Child c1 = new Child(); c1.setChildOnly("childOnly"); c1.setNotReallyHidden("notReallyHidden"); //Attempting to access parent's reallyHidden c1.reallyHidden;//Does not even compile >//main >//Child 

Тот факт, что какой-то другой класс может использовать его косвенно, ничего не говорит о наследовании, но о инкапсуляции.

class Some < private int count; public void increment() < count++; >public String toString() < return Integer.toString( count ); >> class UseIt < void useIt() < Some s = new Some(); s.increment(); s.increment(); s.increment(); int v = Integer.parseInt( s.toString() ); // hey, can you say you inherit it? >> 

Вы также можете получить значение count внутри UseIt через отражение. Это не значит, вы наследуете это.

Читайте также:  How to create zip file in java

Несмотря на то, что значение есть, оно не наследуется подклассом.

Например, подкласс, определенный как:

class SomeOther extends Some < private int count = 1000; @Override public void increment() < super.increment(); count *= 10000; >> class UseIt < public static void main( String . args ) < s = new SomeOther(); s.increment(); s.increment(); s.increment(); v = Integer.parseInt( s.toString() ); // what is the value of v? >> 

Это точно такая же ситуация, как в первом примере. Атрибут count скрыт и не наследуется подклассом вообще. Тем не менее, как указывает DigitalRoss, значение есть, но не посредством наследования.

Скажи это так. Если ваш отец богат и дает вам кредитную карту, вы все равно можете купить вещь за его деньги, но это не значит, что вы унаследовали все эти деньги, не так ли?

Другое обновление

У меня, честно говоря, нет точного термина для его описания, но именно JVM и способ его работы также загружают определение «не унаследованного» родителя.

Мы могли бы фактически изменить родителя, и подкласс все еще будет работать.

//A.java class A < private int i; public String toString() < return ""+ i; >> // B.java class B extends A <> // Main.java class Main < public static void main( String [] args ) < System.out.println( new B().toString() ); >> // Compile all the files javac A.java B.java Main.java // Run Main java Main // Outout is 0 as expected as B is using the A 'toString' definition 0 // Change A.java class A < public String toString() < return "Nothing here"; >> // Recompile ONLY A.java javac A.java java Main // B wasn't modified and yet it shows a different behaviour, this is not due to // inheritance but the way Java loads the class Output: Nothing here 

Я думаю, точный термин можно найти здесь: Спецификация виртуальной машины JavaTM

Итак, мой ответ на вопрос интервьюера: частные члены не наследуются в подклассах, но они доступны объекту подкласса или подкласса только через общедоступные методы получения или установки или любые такие соответствующие методы исходного класса. Обычная практика состоит в том, чтобы сохранять члены частными и получать к ним доступ, используя методы getter и setter, которые являются публичными. Так какой смысл только наследовать методы получения и установки, когда закрытый член, с которым они имеют дело, недоступен для объекта? Здесь «унаследованный» просто означает, что он доступен непосредственно в подклассе, чтобы поиграться с недавно введенными методами в подклассе.

Сохраните приведенный ниже файл как ParentClass.java и попробуйте сами ->

public class ParentClass < private int x; public int getX() < return x; >public void setX(int x) < this.x = x; >> class SubClass extends ParentClass < private int y; public int getY() < return y; >public void setY(int y) < this.y = y; >public void setXofParent(int x) < setX(x); >> class Main < public static void main(String[] args) < SubClass s = new SubClass(); s.setX(10); s.setY(12); System.out.println("X is :"+s.getX()); System.out.println("Y is :"+s.getY()); s.setXofParent(13); System.out.println("Now X is :"+s.getX()); >> Output: X is :10 Y is :12 Now X is :13 

Если мы попытаемся использовать закрытую переменную x ParentClass в методе SubClass, то она не будет напрямую доступна для каких-либо изменений (значит, не наследуется). Но x можно изменить в SubClass с помощью метода setX() исходного класса, как это делается в методе setXofParent() ИЛИ его можно изменить с помощью объекта ChildClass с помощью метода setX() или метода setXofParent(), который в конечном итоге вызывает setX(). Так что здесь setX() и getX() являются своего рода воротами для закрытого члена x ParentClass.

Читайте также:  Javascript begin file with

Другой простой пример: суперкласс Clock имеет часы и минуты как частные члены и соответствующие методы getter и setter как public. Затем идет DigitalClock как подкласс часов. Здесь, если объект DigitalClock не содержит часов и минут, тогда все испорчено.

Источник

Наследование приватных полей и методов?

Maksclub

Максим Федоров, я сперва подумал что на вопросы отвечают те кто уже имеют некоторый опыт, т.е. понимают код! А потом я вспомнил что в интернете есть чел. по имени Максим, который не понимает psvm, и я решил добавить это;)

Maksclub

vabka

bingo347

vabka

vabka

Это значит, что такое поле у B как бы есть, но из-за того что оно приватное — доступ к нему имеют только методы родителя.
Класс B в вашем случае передаёт значение в конструктор родителя, чтобы инициализировать это поле.

vitya_brodov

vabka

Nickname192, на уровне байтов там есть это поле, но никто кроме класса A не знает об этом, по тому компилятор не позволит обратитья к нему.

vabka

Bavashi, обращение?) В мейн потоке куда мы обращаемся?, я не спросил про обращение, я спрашиваю про то, что в классе B в неявном виде существует приватное поле предка, или это что-то другое? Класс В ссылается на класс А через его super(), откуда класс А знает что это поле должен принадлежать классу потомку? ведь в классе В

Bavashi, в каком смысле не существует? Поле есть физически, в памяти. К нему даже можно получить доступ через рефлексию. Твоя терминология неверна. Получается, если положить пачку баксов в сейф, то её как бы не существует, да?

vabka

Василий Банников, по документации получается, что он прав, и это мы с тобой не так понимаем смысл слова «наследуется». https://docs.oracle.com/javase/tutorial/java/IandI.

Erik_Mironov

Подкласс не наследует закрытые члены своего родительского класса. Однако, если у суперкласса есть общедоступные или защищенные методы для доступа к его частным полям, они также могут использоваться подклассом. Так же, если класс-потомок является вложенным классом по отношению к классу-родителю, то имеет доступ ко всем частным полям и методам класса-родителя. В вашем же случае вы обязаны вызвать конструктор родительского класса в классе-потомке. Это не значит что вы получили доступ к приватному полю класса-родителя

А что это значит «не наследует»? Так-то они есть, в памяти они лежат вместе с полями наследника подряд, к ним просто доступа нет.

Erik_Mironov

Войдите, чтобы написать ответ

Как запустить Java.service и Java.scheduler в cBackup.

Источник

Наследование приватных полей и методов?

Понимаю что 100500 раз спрашиваю. Но как наследуются приватные методы, как это понимать нет своего метода getName(), свое приватное поле name же существует. Почему при вызове System.out.println(super.name); выводится «The Darkside Hacker», разве не должно быть «Риша» ?

public class Solution  private String name; Solution(String name)  this.name = name; > private String getName()  return name; > private void sout()  new Solution("The Darkside Hacker")  void printName()  System.out.println(getName()); > >.printName(); > public static void main(String[] args)  new Solution("Риша").sout(); > >

Источник

Оцените статью