Java 多态性赋值语句

Java 多态性赋值语句,java,polymorphism,polymorphic-associations,Java,Polymorphism,Polymorphic Associations,我对其赋值语句的多态性有疑问,例如,这是一个超类 public class Person { private String firstName; private String middleInitial; private String lastName; private int age; public Person(String firstName,String mi

我对其赋值语句的多态性有疑问,例如,这是一个超类

   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();
还有这个

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

在第一个例子中,你有两个对象,都是Employee类型,你有两个不同的引用,一个是Person引用,另一个是Employee引用

在第二种情况下,您有一个对象,其中两个引用指向它,一个是Person,另一个是Employee


对象始终是您用new关键字实例化的类型(在本例中,对象始终是employee)。但是,您可以拥有指向实际对象的不同类型的引用(引用可以是对象的类型,也可以是其超类的类型)。

在第一个对象中,您有两个对象,都是Employee类型,并且您有两个不同的引用,一个是个人推荐人,另一个是员工推荐人

在第二种情况下,您有一个对象,其中两个引用指向它,一个是Person,另一个是Employee


对象始终是您用new关键字实例化的类型(在本例中,对象始终是employee)。但是,您可以拥有指向实际对象的不同类型的引用(引用可以是对象的类型,也可以是其超类的类型)。

第一个引用创建一个被引用为
人员的
员工,以及一个被引用为
员工的
员工
employee1
只有
Person
方法,而
employee2
既有
Person
方法,也有
employee2
方法


第二个创建一个
员工
,然后创建一个
人员
引用,引用同一个
员工
。只有在
Person
类中定义的方法才可用于
employeeKyel2
实例,而
employeeKyle
将拥有所有
Employee
方法。

第一个方法创建一个被引用为
Person的
Employee
,以及被引用为
员工的
员工
employee1
只有
Person
方法,而
employee2
既有
Person
方法,也有
employee2
方法


第二个创建一个
员工
,然后创建一个
人员
引用,引用同一个
员工
。只有在
Person
类中定义的方法才可用于
employeeKyel2
实例,而
employeeKyle
将具有所有
Employee
方法。

在第二个示例中,您只有一个对象,有两个指向它的指针。如果修改
employeeKyle
,则也将修改
employeeKyle2
(它们是相同的对象)。您将
employeeKyle2
称为个人而非
员工
这一事实只会对您在该引用中允许使用的方法有所帮助。在引擎盖下,它仍然指向同一个
Employee
对象,因此如果您稍后将
employeeKyle2
转换为
Employee
,它将工作,并且不会抛出转换异常


在第一个示例中,创建两个不同的对象,这是唯一的区别。它们是引擎盖下的两个
Employee
对象,但是您只能在
employee2

上使用
Person
方法。在第二个示例中,您只有一个对象,有两个指向它的指针。如果修改
employeeKyle
,则也将修改
employeeKyle2
(它们是相同的对象)。您将
employeeKyle2
称为个人而非
员工
这一事实只会对您在该引用中允许使用的方法有所帮助。在引擎盖下,它仍然指向同一个
Employee
对象,因此如果您稍后将
employeeKyle2
转换为
Employee
,它将工作,并且不会抛出转换异常


在第一个示例中,创建两个不同的对象,这是唯一的区别。它们是引擎盖下的两个
Employee
对象,但在第一次分配中,只能在
employee2

上使用
Person
方法,Person employee1=new Employee();这是否意味着我无法访问employee中的方法?只有Person类?是的,除非你投下它。((雇员)雇员1)setFirstName(“Bob”)可以。如果我没弄错你的问题,可以。因此,基本上,Person引用只会“看到”Person类中的内容,即使它指向的对象是Employee对象。谢谢leo!你的问题是对的,现在我完全明白了,我只是想知道为什么其他人会把它作为一项任务。最后一件事是,如果我要做这个人p1=new Employee(),这是否意味着我真的不能这样做?p1.getEarnings()收入是Employee类的一部分?;)不,你不能。当您执行Person p1=new Employee()时,p1只看到一个人,所以它无法看到特定于该员工的内容。若您想访问任何特定于员工的内容,必须将其转换为员工,如Gillaume所说:Employee emp=(Employee)p1;在第一次分配中,Person employee1=新员工();这是否意味着我无法访问employee中的方法?只有Person类?是的,除非你投下它。((雇员)雇员1)setFirstName(“Bob”)可以。如果我没弄错你的问题,可以。因此,基本上,Person引用只会“看到”Person类中的内容,即使它指向的对象是Employee对象。谢谢leo!你有