hiwa doski Ответов: 1

Почему это печатает null, а не java ?


i know about variable shadowing but i don't think below is case of variable shadowing  

<pre>
public class Main
{
	public static void main(String[] args) {
	    Person p = new Person();
        p.setName("Java"); // set name to be =Java 
        Employee e = new Employee();
        e.show(); // prints null
	}
}



class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Employee extends Person{
    void show (){
        System.out.println(getName());
    }
}


как вы, ребята, можете видеть, класс "сотрудник" расширяет "лицо", таким образом, у него будут все его поля и метод, верно ? тогда почему, когда я печатаю "имя" в "сотруднике", он печатает null, разве это не то же самое имя, которое я установил в "Java" ? я пытался сделать это поле общедоступным, но оно все равно не работало, я просто не понимаю, как метод `getName()` возвращает значение `name`, которое я установил для него методом `setName ()`, и оно равно нулю !

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

i tried many things but couldn't figure it out.

CHill60

Вы установили e, чтобы быть a новый Работник. Это подразумевает и нового человека. Попробуйте установить его на человека p, который у вас уже есть

hiwa doski

О да, это имеет смысл, но как установить employee на нового человека, который у меня уже есть, поскольку ссылочная переменная Employee не может указывать на объект person ?

CHill60

Решение Afzaal по 1 лучше, чем я мог объяснить :-)

hiwa doski

да, я понял, спасибо вам, ребята.

1 Ответов

Рейтинг:
6

Afzaal Ahmad Zeeshan

Цитата:
как вы, ребята, можете видеть, класс "сотрудник" расширяет "лицо", таким образом, он будет иметь все свои поля и метод, верно ?
Только если вы это сделаете,
Employee e = (Employee)p;
Затем, после приведения, вы можете увидеть, как печатается Java. В настоящее время нет никакой связи между тем, что имеет р, и тем, что содержит е. Даже это будет работать только и только в том случае, если вы создали экземпляр Employee, подобный этому.
Person p = new Employee();
Employee e = (Employee)p;
e.show();
Это похоже на то, чтобы иметь это,
String a = "One string";
String b = "Second string";

// And then expecting
System.out.println(b); // to print "One string"
Только предполагать это, потому что оба связаны через систему типов, но они не являются одним и тем же в памяти. Вы можете сделать их одинаковыми, связав их ссылки,
String a = "One string";
String b = a; // Linked!

System.out.println(b); // One string
Но это становится запутанным и очень громоздким, когда имеешь дело с родителями и детьми на Java. Потому что вам нужно не только назначить переменные, но и правильно их разыграть—и обработать ClassCastException Вот что вы получите от своего кода, если попробуете этот бросок.

Person p = new Person();
p.setName("Java");
Employee e = new Employee(); 
e = (Employee)p;              // ClassCastException
// OR
Employee e = (Employee) p;    // ClassCastException.
Я рекомендую вам прочитать это, чтобы понять, как работает наследование в Java.

Наследование (учебные пособия Java™ > изучение языка Java > интерфейсы и наследование)[^]


hiwa doski

спасибо вам за ваш объясненный ответ, но у меня все еще есть некоторая путаница о том, как/когда наследование делается, я читал документ, который вы мне прислали, и он все время говорил, что он наследует все поля от суперкласса, так почему же ссылочная переменная "e" `name` не имеет значения Java, поскольку она наследуется от него, или она не наследует значения ?

Afzaal Ahmad Zeeshan

Потому что это два разных объекта. Объект наследует, но не копирует значения.

Каждый ребенок может иметь некоторое богатство по наследству от родителей, но ваш сосед не получит богатства вашего соседа. твой отец просто потому, что он сын.

hiwa doski

ага, ладно, понял, спасибо.

CHill60

Отличная аналогия - 5'd

Afzaal Ahmad Zeeshan

Спасибо.