Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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 程序获取非null子项并继续对其执行操作_Java_Inheritance - Fatal编程技术网

Java 程序获取非null子项并继续对其执行操作

Java 程序获取非null子项并继续对其执行操作,java,inheritance,Java,Inheritance,我基于父类创建了三个子类 当我的程序运行时,其中一个子类将被实例化,我有一些操作需要非空的子对象 下面是我的一些代码示例: 家长: public class Person { // code here doMore(Operation operation) { //code here } } 操作等级: public class Operation { Person person; public Operation(Pe

我基于父类创建了三个子类

当我的程序运行时,其中一个子类将被实例化,我有一些操作需要非空的子对象

下面是我的一些代码示例:

家长:

public class Person {
     // code here
     doMore(Operation operation) {
          //code here
     }
}
操作等级:

public class Operation {

     Person person;

     public Operation(Person person) {
          this.person = person;
     }
}
儿童班:

public class Doctor extends Person {
     // code here
}

public class Lawyer extends Person {
     // code here
}

public class Pilot extends Person {
     // code here
}
主程序:

// String temp is calculated 

Doctor doctor = null;
Lawyer lawyer = null;
Pilot pilot = null;

if (temp.equals("doctor")) {
     doctor = new Doctor();
     Operation operation = new Operation(doctor);
     doctor.doMore(operation);
} else if (temp.equals("lawyer")) {
     lawyer = new Lawyer();
     Operation operation = new Operation(lawyer);
     lawyer.doMore(operation);
} else {
     pilot = new Pilot();
     Operation operation = new Operation(Pilot);
     pilot.doMore(operation);
}
正如您所看到的,根据temp的值,三个子类中只有一个将被实例化,并且只有一个对象是非null的

在实例化之后,我还有两个操作将使用新创建的对象。现在,重复同样的两行三次似乎是多余的


有没有办法简化这两行代码,使其只使用一次?我可以在这里使用继承的一些特性吗?

事实上,这非常简单。虽然这不是我个人编写代码的方式,但您可以通过执行以下操作获得所需的结果:

Person person = null;

if (temp.equals("doctor")) {
  person = new Doctor();
} else if (temp.equals("lawyer")) {
  person = new Lawyer();
} else {
  person = new Pilot();
}

Operation operation = new Operation(person);
person.doMore(operation);
由于
Person
是所有三个类都实现的接口,因此可以将它们都视为
Person

无论如何,我会编写一个
enum
来封装您所比较的字符串,并编写一个
switch
语句。也就是说,您还可以
在字符串上切换

switch (temp) {
  case "doctor": break;
  case "lawyer": break;
  default: break;
}

事实上,这很简单。虽然这不是我个人编写代码的方式,但您可以通过执行以下操作获得所需的结果:

Person person = null;

if (temp.equals("doctor")) {
  person = new Doctor();
} else if (temp.equals("lawyer")) {
  person = new Lawyer();
} else {
  person = new Pilot();
}

Operation operation = new Operation(person);
person.doMore(operation);
由于
Person
是所有三个类都实现的接口,因此可以将它们都视为
Person

无论如何,我会编写一个
enum
来封装您所比较的字符串,并编写一个
switch
语句。也就是说,您还可以
在字符串上切换

switch (temp) {
  case "doctor": break;
  case "lawyer": break;
  default: break;
}

很多取决于
操作
类的定义。@tsolakp谢谢。它也被添加到我的帖子中。
temp=“doctor”
将始终返回真实值(这是一个赋值)。您可能应该使用
temp.equals(“医生”)
,它实际上可以进行字符串比较。@alephtwo很好的捕捉。我已经修改过了。谢谢。很多都取决于
操作
类的定义。@tsolakp谢谢。它也被添加到我的帖子中。
temp=“doctor”
将始终返回真实值(这是一个赋值)。您可能应该使用
temp.equals(“医生”)
,它实际上可以进行字符串比较。@alephtwo很好的捕捉。我已经修改过了。谢谢。此外,如果你愿意,你可以将ifs移动到a。然后您将拥有
Person-Person=createPerson(temp)谢谢你的回答。但是我想知道,如果Person是一个抽象类,我还可以这样做吗?如果
Doctor
等都扩展
Person
,你可以这样做。此外,如果你愿意,你可以将ifs移动到a。然后您将拥有
Person-Person=createPerson(temp)谢谢你的回答。不过我想知道,如果Person是一个抽象类,我还可以这样做吗?你可以,只要
Doctor
等都扩展
Person