Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从构造函数构造链接的Java对象_Java_Arrays_Object_Inheritance_Polymorphism - Fatal编程技术网

从构造函数构造链接的Java对象

从构造函数构造链接的Java对象,java,arrays,object,inheritance,polymorphism,Java,Arrays,Object,Inheritance,Polymorphism,我一直很沮丧,因为我一直想把我的头缠在OOD上。我试图构建一个有三个类的程序——一个叫做Person的类,它有一个由个人信息组成的构造函数。另一个名为Doctor的类继承了Person类,并简单地构造了一个具有额外字段(大多数字段,即名称、地址将指向Person对象)的对象,称为Speciality。我使用另一个类来构建java应用程序,以创建、查看和修改person和doctor对象中的字段 我已经构建了person和doctor类,您可以在本文底部找到它们的相关代码。当我尝试创建医生对象时,

我一直很沮丧,因为我一直想把我的头缠在OOD上。我试图构建一个有三个类的程序——一个叫做Person的类,它有一个由个人信息组成的构造函数。另一个名为Doctor的类继承了Person类,并简单地构造了一个具有额外字段(大多数字段,即名称、地址将指向Person对象)的对象,称为Speciality。我使用另一个类来构建java应用程序,以创建、查看和修改person和doctor对象中的字段

我已经构建了person和doctor类,您可以在本文底部找到它们的相关代码。当我尝试创建医生对象时,问题就出现了,因为我的代码似乎在创建一个与person对象没有任何关系的全新医生对象。我试图编辑person对象的firstName字符串,但医生对象没有更新以反映这一点。它似乎创建了自己的永久名称,而不是简单地指向person对象中定义的名称

我通过用户输入创建person对象,并使用以下行存储它们

        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有关系时,才应使用继承。例如,山地自行车是自行车,因此使用
    MountainBike
    Class
    extend
    'bike'是明智的。如果你不能说存在“是”关系,那么就不要使用继承

  • 组成。组合也是一个强大的工具,可以说比继承更健壮、更不脆弱。当类别B是类别A的属性时(或当类别A具有类别B时),使用合成。在本例中,将类B设置为类A的实例字段

在您描述的模型中,医生是个人,因此使用继承似乎是非常明智的。由于我们所能看到的领域模型是您展示的两个类,所以我也会选择让Doctor extend Person

作为一种风格,当您打算从基类重写方法时,应该养成使用
@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对象。这是继承。那将是加利福尼亚