Заявление о назначении полиморфизма - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть вопрос относительно полиморфизма относительно его оператора присваивания, например, это супер класс

   public class Person {

            private String firstName;
            private String middleInitial;
            private String lastName;
            private int age;

            public Person(String firstName,String middleInitial , String lastName , int age){
                setFirstName(firstName);
                setMiddleInitial(middleInitial);
                setLastName(lastName);
                setAge(age);
            }

            public void setFirstName(String firstName){
                this.firstName = firstName;
            }

            public String getFirstName(){
                return firstName;
            }

            public void setMiddleInitial(String middleInitial){
                this.middleInitial = middleInitial;
            }

            public String getMiddleInitial(){
                return middleInitial;
            }

            public void setLastName(String lastName){
                this.lastName = lastName;
            }

            public String getLastName(){
                return lastName;
            }

            public void setAge(int age){
                this.age = age;
            }

            public int getAge(){
                return age;
            }

            public String toString(){
                return String.format("First Name: "+getFirstName()+"\nMiddle Initial: "+getMiddleInitial()+
                                        "\nLast Name: "+getLastName()+"\nAge: "+getAge());
            }
    }

А это Производный класс

 public class Employee extends Person{

        private Contact contact;

        public Employee(String firstName,String middleInitial , String lastName , int age, Contact contact){
            super(firstName,middleInitial,lastName,age);
            this.contact = contact;
        }
public String toString(){
        return String.format(super.toString()+contact.toString());
    }
}

Теперь мой вопрос: в чем разница между этими операторами присваивания? а в чем разница? Я знаю, что Сотрудник - это Человек, но я хочу знать, в чем разница между этими двумя:

 Person employee1 = new Employee();
    Employee employee2 = new Employee();

и This

 Employee employeeKyle = new Employee();
    Person employeeKyel2 = employeeKyle;

Я вроде как переживаю из-за этого.

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

В первом у вас есть 2 ОБЪЕКТА, оба имеют тип Сотрудник, и у вас есть две разные ссылки на них, одна из которых является ссылкой на Персона, а другая - ссылкой на Сотрудника.

Во втором случае у вас есть 1 ОБЪЕКТ, на который указывают 2 ССЫЛКИ, будучи одним Лицом, а другой - Сотрудником.

Объект всегда того типа, для которого вы создали его экземпляр с ключевым словом new (в этом случае объект всегда является сотрудником). Однако у вас могут быть разные типы ссылок, указывающих на реальный объект (ссылки могут относиться либо к типу объекта, либо к одному из его суперклассов).

1 голос
/ 07 ноября 2011

Во втором примере у вас есть только один объект с двумя указателями на него.Если вы измените employeeKyle, то employeeKyle2 также будет изменено (это один и тот же объект).Тот факт, что вы называете employeeKyle2 персоной, а не Employee, полезен только для тех методов, которые вам разрешено использовать для этой ссылки.Под капотом он по-прежнему указывает на тот же объект Employee, поэтому, если позже вы будете разыгрывать employeeKyle2 как Employee, он будет работать и не сгенерирует исключение приведения.вы создаете два разных объекта, это единственная разница.Это два Employee объекта под капотом, но вы можете использовать только методы Person на employee2.

1 голос
/ 07 ноября 2011

Первый создает Employee, на который ссылаются как Person, и Employee, на который ссылаются как Employee.employee1 имеет только Person методы, в то время как employee2 имеет методы Person и Employee.

Второй создает Employee, а затем создает ссылку Person на тот жеEmployee.Только экземпляры, определенные в классе Person, будут доступны для экземпляра employeeKyel2, в то время как employeeKyle будет иметь все методы Employee.

...