Member 13257407 Ответов: 1

Наследование переменной с помощью ключевого слова super в java


class Person
{
	String name;
	Person()
	{	
	}
	Person(String name)
	{
		this.name=name;
	}
}
class Employee extends Person
{
	void getdetails()
	{
		System.out.println("Name : "+super.name);
	}
}
class DoubtInSuper
{
	public static void main(String arr[])
	{
		Person p=new Person("Virat");
		Employee e=new Employee();
		e.getdetails();
	}
}


Что я уже пробовал:

Выход выше программы -
Наименование : нулевой

Richard Deeming

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

Или вы ожидали, что значение поля в одном экземпляре волшебным образом будет скопировано в совершенно другой экземпляр?

Member 13257407

Я не уверен.
Но ... super.name' должен показывать значение строки 'name' в непосредственном родительском классе.
и я передал строку "Virat" в имя через параметризованный конструктор в основном методе.

Если я сказал Здесь что-то не так, пожалуйста, дайте правильное объяснение.

Richard Deeming

Но вы этого не сделали! Вы создали два совершенно отдельных объекта - один экземпляр Person класс, которому вы передали имя; и один совершенно отдельный экземпляр Employee класс, к которому вы имеете НЕ передал имя.

Вам действительно нужно пройти через некоторые основные учебные пособия: Учебные Пособия По Java™ [^]

1 Ответов

Рейтинг:
6

OriginalGriff

Проблема в том, что вы создали здесь два отдельных экземпляра: p есть один экземпляр, и это человек, e это второй отдельный экземпляр, и его "сотрудник". Эти два экземпляра никак не "соединены", так что же происходит с ними? p не бывает, чтобы e.
Подумайте об этом: вы покупаете машину, а мобильный кладете в бардачок. Я подвезу вас на своем "Мерседесе" (который, как и "Форд", "Бугатти" и "Кадиллак") - вы ожидаете найти свой мобильный в моем бардачке?


Member 13257407

Тогда как получить доступ к "имени" класса Person в классе Employee?

OriginalGriff

Класс Employee * расширяет * класс Person так же, как Mercedes расширяет Car - это "суперсет", который включает в себя все, что делает базовый класс, плюс добавленные свойства, функции и тому подобное.
Потому что у машины есть перчаточный ящик, и у "Мерседеса", и у "Форда", и у "Бугатти", хотя им и не нужно специально упоминать об этом. Просто попробуйте: используйте свойство Name и посмотрите, что произойдет.
е.13257407 Наименование = "Участник ";

Member 13257407

класс person
{
Строковое имя;
Человек()
{
}
Персона(строковое имя)
{
это.name=имя;
}
}
класс сотрудник расширяет лицо
{
void getdetails()
{
System. out. println ("имя :" +super.name);
}
}
класс DoubtInSuper
{
public static void main(String arr[])
{
Человек p=новый человек ("Вират");
Сотрудник e=новый сотрудник();
е.getdetails();
System. out. println ("имя :" +e.name);
}
}



Тем не менее выход есть -
Наименование : нулевой
Наименование : нулевой

OriginalGriff

Прочтите, что я сказал:
"Проблема в том, что вы создали здесь два отдельных экземпляра: p-один экземпляр, и это человек, e-второй отдельный экземпляр, и его "сотрудник". Эти два экземпляра никак не "соединены", поэтому то, что происходит с р, не происходит с Е."
Сотрудник-это продолжение Человека, но это не значит, что каждый e разделяет тот же самый p, так же как каждый автомобиль разделяет тот же самый перчаточный ящик, все они связаны через червоточину в пространстве!
Мой "Мерседес" - это машина, ваш "Форд" - тоже машина. Вам не нужно покупать ничего лишнего, когда вы покупаете Ford, чтобы получить автомобиль!

Когда вы создаете экземпляр Employee, вы создаете экземпляр Person одновременно и с тем же именем - потому что Employee * - это человек!

В вашем примере вы получаете null, потому что ваш сотрудник не "заполняет" данные о человеке, когда вы его создаете.