Назначение ссылочных переменных в Java (примеры) - PullRequest
0 голосов
/ 23 июня 2018

с двумя классами:

лицо

/**
 * This class models a person.
 *
 * @author author name
 * @version 1.0.0
 */
public class Person  {

    /* Name of the person */
    private String  name;

    /* Address of the person */
    private String  address;

    /**
     * Constructs a <code>Person</code> object.
     *
     * @param initialName  the name of the person.
     * @param initialAddress  the address of the person.
     */
    public Person (String initialName, String initialAddress) {

        name = initialName;
        address = initialAddress;
    }

    /**
     * Returns the name of this person.
     *
     * @return the name of this person.
     */
    public String getName() {

        return this.name;
    }

    /**
     * Returns the address of this person.
     *
     * @return the address of this person.
     */
    public String getAddress() {

        return this.address;
    }
}

и Сотрудник

/**
 * This class models an Employee.
 *
 * @author author name
 * @version 1.0.0
 */
public class Employee extends Person  {

    /* Salary of the employee */
    private double salary;

    /**
     * Constructs an <code>Employee</code> object.
     *
     * @param initialName  the name of the employee.
     * @param initialAddress  the address of the employee.
     * @param initialSalary  the salary of the employee.
     */
    public Employee (String initialName, String initialAddress,
                     double initialSalary) {

        super(initialName, initialAddress);
        salary = initialSalary;
    }

    /**
     * Returns the salary of this employee.
     *
     * @return the salary of this employee.
     */
    public double getSalary() {

        return this.salary;
    }

    /**
     * Modifies the salary of this employee.
     *
     * @param newSalary  the new salary.
     */
    public void setSalary(double newSalary) {

        salary = newSalary;
    }
}

Сотрудник - это человек, поэтому каждый объект Employee также является объектом Person. По этой причине ссылочная переменная Employee может быть назначена ссылочной переменной Person.

Лицо человек = новый сотрудник («Джо Смит», «100 Main Ave», 3000,0);

Но можно ли его также присвоить ссылочной переменной Employee?

Сотрудник сотрудник = новый сотрудник ("Джо Смит", "100 Main Ave", 3000,0);

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

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Это действительно не имеет значения.Вы можете использовать любой из них.Если у вас есть класс A и подкласс A B, и вы хотите использовать только функциональность A, переходите к A a = new B();.

Однако, если вы используете массивы Person, это другая история.Если у вас Person в качестве суперкласса и Manager и Employee в качестве подклассов, тогда вы можете поместить любого человека в Person[].Однако, если вы создадите массив Manager[], вы не сможете поместить туда Employee.

0 голосов
/ 23 июня 2018

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

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

Например,Предположим, что в этом сценарии два класса Employee и Student расширяют класс Person и оба переопределяют один и тот же метод.Разница в том, что метод вызывается во время выполнения.

class Person {
    public String getTag(){
        return "This is Person"
    }
}

class Employee extends Person {
    public String getTag(){
        return "This is Employee"
    }
}


class Student extends Person {
    public String getTag(){
        return "This is Student"
    }
}

Person person1 = new Person();
Person person2 = new Employee();
Person person3 = new Student();
Employee employee = new Employee();
Student student = new Student();

person1.getTag(); //it will return "This is Person"
person2.getTag(); //it will return "This is Employee"
person3.getTag(); //it will return "This is Student"
employee.getTag(); //it will return "This is Employee"
student.getTag(); //it will return "This is Student"

Обратите внимание, что person2 и person3 имеют ссылку на объект дочернего класса, он будет вызывать определение метода дочернего класса, а не определение его собственного метода

0 голосов
/ 23 июня 2018
(1) Person person = new Employee("Joe Smith", "100 Main Ave", 3000.0);
(2) Employee employee = new Employee("Joe Smith", "100 Main Ave", 3000.0);

Оба верны. (1) создает Employee, а затем помещает его в объект person. Вы теряете поля / методы сотрудника, но вы можете получить их с помощью приведения типа так: Employee employeeFromPerson=(Employee)person. Вы можете ссылаться только на личные методы без приведения.

(2) в основном создает сотрудника и помещает его в объект сотрудника. Вы можете ссылаться на методы / поля Person и Employee с помощью этого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...