从构造函数构造链接的Java对象
我一直很沮丧,因为我一直想把我的头缠在OOD上。我试图构建一个有三个类的程序——一个叫做Person的类,它有一个由个人信息组成的构造函数。另一个名为Doctor的类继承了Person类,并简单地构造了一个具有额外字段(大多数字段,即名称、地址将指向Person对象)的对象,称为Speciality。我使用另一个类来构建java应用程序,以创建、查看和修改person和doctor对象中的字段 我已经构建了person和doctor类,您可以在本文底部找到它们的相关代码。当我尝试创建医生对象时,问题就出现了,因为我的代码似乎在创建一个与person对象没有任何关系的全新医生对象。我试图编辑person对象的firstName字符串,但医生对象没有更新以反映这一点。它似乎创建了自己的永久名称,而不是简单地指向person对象中定义的名称 我通过用户输入创建person对象,并使用以下行存储它们从构造函数构造链接的Java对象,java,arrays,object,inheritance,polymorphism,Java,Arrays,Object,Inheritance,Polymorphism,我一直很沮丧,因为我一直想把我的头缠在OOD上。我试图构建一个有三个类的程序——一个叫做Person的类,它有一个由个人信息组成的构造函数。另一个名为Doctor的类继承了Person类,并简单地构造了一个具有额外字段(大多数字段,即名称、地址将指向Person对象)的对象,称为Speciality。我使用另一个类来构建java应用程序,以创建、查看和修改person和doctor对象中的字段 我已经构建了person和doctor类,您可以在本文底部找到它们的相关代码。当我尝试创建医生对象时,
persons[amountPersons] = new Person (firstName, lastName, homeAddress, phoneNumber);
amountPersons++;
一旦创建了person对象,用户就可以输入personNumber并像这样创建一个doctor对象
person = getPersonID(personID);
int personNumber;
String firstName = null;
String lastName = null;
String homeAddress = null;
String phoneNumber = null;
firstName = person.firstName;
lastName = person.lastName;
homeAddress = person.homeAddress;
phoneNumber = person.phoneNumber;
personNumber = person.personNumber;
System.out.print ("Enter speciality of the doctor: ");
String speciality = input.nextLine();
doctors[amountDoctors] = new Doctor (firstName, lastName, homeAddress, phoneNumber, speciality);
amountDoctors++;
我到底做错了什么?为大量的代码道歉-我已经尽我所能精简了它,但我不确定问题出在哪里,所以我只能做这么多
个人类别
public class Person {
//Instance Variables
protected String firstName;
protected String lastName;
protected String homeAddress;
protected String phoneNumber;
protected int personNumber;
private static int NumberSystem = 1;
public Person()
{
firstName = " ";
lastName = " ";
homeAddress = " ";
phoneNumber = " ";
personNumber = 0;
}
public Person (String firstName, String lastName, String homeAddress, String phoneNumber)
{
// Initialize instance variables
this.firstName = firstName;
this.lastName = lastName;
this.homeAddress = homeAddress;
this.phoneNumber = phoneNumber;
personNumber = NumberSystem;
NumberSystem = NumberSystem + 1;
}
public String toString()
{
String p;
p = "=================================================" +"\n" +
"Identification Number: " + personNumber +"\n" +
"Name: " + firstName +"\n" +
"Surname: " + lastName +"\n" +
"Address: " + homeAddress +"\n" +
"Mobile/Telephone: " + phoneNumber +"\n";
return p;
}
public class Doctor extends Person{
// the aim of Doctor subclass is to simply add a speciality field
private String speciality;
int doctorID;
public Doctor() {
doctorID = 0;
speciality = "none";
}
public Doctor(String firstName, String lastName, String homeAddress, String phoneNumber, String speciality) {
super(firstName, lastName, homeAddress, phoneNumber);
this.speciality = speciality;
}
public String toString()
{
String d;
d = "=================================================" +"\n" +
"Doctor Number: " + doctorID +"\n" +
"Person Number: " + personNumber +"\n" +
"Name: " + firstName +"\n" +
"Surname: " + lastName +"\n" +
"Address: " + homeAddress +"\n" +
"Mobile/Telephone: " + phoneNumber +"\n" +
"Speciality: " + speciality +"\n";
return d;
}
}
医生
public class Person {
//Instance Variables
protected String firstName;
protected String lastName;
protected String homeAddress;
protected String phoneNumber;
protected int personNumber;
private static int NumberSystem = 1;
public Person()
{
firstName = " ";
lastName = " ";
homeAddress = " ";
phoneNumber = " ";
personNumber = 0;
}
public Person (String firstName, String lastName, String homeAddress, String phoneNumber)
{
// Initialize instance variables
this.firstName = firstName;
this.lastName = lastName;
this.homeAddress = homeAddress;
this.phoneNumber = phoneNumber;
personNumber = NumberSystem;
NumberSystem = NumberSystem + 1;
}
public String toString()
{
String p;
p = "=================================================" +"\n" +
"Identification Number: " + personNumber +"\n" +
"Name: " + firstName +"\n" +
"Surname: " + lastName +"\n" +
"Address: " + homeAddress +"\n" +
"Mobile/Telephone: " + phoneNumber +"\n";
return p;
}
public class Doctor extends Person{
// the aim of Doctor subclass is to simply add a speciality field
private String speciality;
int doctorID;
public Doctor() {
doctorID = 0;
speciality = "none";
}
public Doctor(String firstName, String lastName, String homeAddress, String phoneNumber, String speciality) {
super(firstName, lastName, homeAddress, phoneNumber);
this.speciality = speciality;
}
public String toString()
{
String d;
d = "=================================================" +"\n" +
"Doctor Number: " + doctorID +"\n" +
"Person Number: " + personNumber +"\n" +
"Name: " + firstName +"\n" +
"Surname: " + lastName +"\n" +
"Address: " + homeAddress +"\n" +
"Mobile/Telephone: " + phoneNumber +"\n" +
"Speciality: " + speciality +"\n";
return d;
}
}
通过
person=getPersonID(personID)获得的人
与您使用医生[amountDoctors]=新医生(名字、姓氏、家庭地址、电话号码、专业)创建的医生是完全不同的对象。
仅仅因为它们具有相同的名称(如名字等),并不意味着对象之间存在任何关系
你可以用几种方法来解决这个问题。例如,您不能创建一个跟随医生的人,而只是创建一个医生。然而,这并不能反映现实生活,所以你可以用医生替换你存储在数组中的人
Person[] people = // however you initialise it;
Doctor[] doctors // however you initialise it;
因为医生也是一个人,你可以简单地说人[i]=Doctor
。根据上面的代码,它可能包装在如下方法调用中:
// I'm assuming personID is an int, but you may need to adapt this
private void replacePerson(int personID,
Person person) {
int index = // get index of personID from the array
people[index] = person;
}
把这个叫做
Doctor doctor = new Doctor (firstName, lastName, homeAddress, phoneNumber, speciality);
doctors[amountDoctors] = doctor;
amountDoctors++;
replacePerson(personID, doctor);
在设计两个彼此有关系的对象时,有两种常用的模式
- 继承权。继承是一个强大的工具,但它不是万能的,它有自己的问题和局限性。仅当类B与类a有关系时,才应使用继承。例如,山地自行车是自行车,因此使用
ClassMountainBike
'bike'是明智的。如果你不能说存在“是”关系,那么就不要使用继承extend
- 组成。组合也是一个强大的工具,可以说比继承更健壮、更不脆弱。当类别B是类别A的属性时(或当类别A具有类别B时),使用合成。在本例中,将类B设置为类A的实例字段
@Override
注释的习惯。执行此操作时,编译器将提醒您注意其他难以发现的错误。您应该使用@Override
注释toString()
方法(从对象继承而来)
当我尝试按代码所示创建医生对象时,就会出现问题
创建一个完全没有关系的全新医生对象
任何人反对的东西
使用创建医生实例时
Doctor doc = new Doctor(...);
你得到的对象既有它自己的类型,也有它父母的类型,例如医生是医生,医生是人。以下是合法的:
Person person = new Doctor(...);
您可以将子类中的对象指定给其超类型(或父类)的变量。没有创建新的Person对象,只创建了Doctor对象(可以将其分配给Person变量,因为Doctor是Person)
这是不允许的:
Doctor doc = new Person(...);
所有的医生都是人,但是。。。并不是所有人都是医生,所以这项任务会有问题。编译器不会让你这么做。一旦你创建了一个医生
它就会得到他自己的成员变量。这样想:
// I'm assuming personID is an int, but you may need to adapt this
private void replacePerson(int personID,
Person person) {
int index = // get index of personID from the array
people[index] = person;
}
你有一个人
,他的夹克上有铭牌、地址牌等。现在你把这个人的盘子递给他。之后你想把他提升为医生,但既然医生继承了人,他也有自己的铭牌、地址牌等。
他们没有分享
因此,您要做的是使用合成
。
e、 g
现在,如果您更改人员的姓名,它还将更新所有指向该人员的医生的姓名。发生的事情就是应该发生的事情。医生是人,但人不是医生
现在,当您创建Person对象时,您将创建类Person的实例,并将其作为对象放置在堆中
然后从该对象中检索各个字段,并使用它们初始化Doctor的一个新实例,并将这个新对象放入堆中。这是一个独特的Doctor类型的新对象,也是Person类型,但它不是您创建的old Person对象。这是继承。那将是加利福尼亚