我对其赋值语句的多态性有疑问,例如,这是超级类
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());
}
}
这就是The Derived Class
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;
我对这些事情感到很难过。
答案 0 :(得分:2)
在第一个中你有2个OBJECTS,两个都是Employee类型,你有2个不同的引用,一个是Person引用,另一个是Employee引用。
在第二种情况下,你有1个OBJECT,其中2个REFERENCES指向它,是一个Person,另一个是Employee。
对象始终是您使用 new 关键字实例化的类型(在这种情况下,对象始终是员工)。但是,您可以使用指向实际对象的不同类型的引用(引用可以是对象类型或其超类之一)。
答案 1 :(得分:1)
第一个创建Employee
,引用为Person
,Employee
引用为Employee
。 employee1
只有Person
个方法,而employee2
同时包含Person
和Employee
方法。
第二个创建Employee
,然后创建对同一Person
的{{1}}引用。只有Employee
类中定义的方法才可用于Person
实例,而employeeKyel2
将包含所有employeeKyle
方法。
答案 2 :(得分:1)
在你的第二个例子中,你只有一个对象,有两个指针。如果修改employeeKyle
,则employeeKyle2
也将被修改(它们是同一个对象)。您将employeeKyle2
称为Person而不是Employee
的事实仅对您允许在该引用上使用的方法有用。在引擎盖下,它仍指向相同的Employee
对象,因此如果您稍后将employeeKyle2
转换为Employee
,它将起作用而不会抛出强制转换异常。
在第一个示例中,您创建了两个不同的对象,这是唯一的区别。它们是两个Employee
对象,但您只能在Person
上使用employee2
方法。