[英]java Having multiple constructors for superclass
我有一个带有3个构造函数的超类,我想知道是否存在编写子类构造函数的更聪明的方法
public class Person{
private String name;
private int age;
private String homeTown;
public Person(String name){
this.name = name;
this.age = 18;
this.homeTown = "Atlanta";
}
public Person(String name, int age){
this.name = name;
this.age = age;
this.homeTown = "Atlanta";
}
public Person(String name, int age, String homeTown){
this.name = name;
this.age = age;
this.homeTown = homeTown;
}
我还有一个继承超类的子类
public class Student extends Person{
private double avgGPA;
private int ID;
private String[] classes;
public Student(double avgGPA, int ID, String[] classes, String name){
super(name);
this.avgGPA = avgGPA;
this.ID = ID;
this.classes = classes;
}
public Student(double avgGPA, int ID, String[] classes, String name, int age){
super(name, age);
this.avgGPA = avgGPA;
this.ID = ID;
this.classes = classes;
}
public Student(double avgGPA, int ID, String[] classes, String name, int age, String homeTown){
super(name, age, homeTown);
this.avgGPA = avgGPA;
this.ID = ID;
this.classes = classes;
}
我的子类可以正常运行,并且不会出错,但是我想知道是否还有另一种方法可以为子类编写一个构造器,而无需编写相同的构造器3次,只是因为超类具有3个不同的构造器。
好吧,Java中有一些东西可以简化您的超类。 您可以使用this();
调用同一类中的另一个构造函数this();
。 因此,与其为每个构造函数设置每个变量,不如使用一个变量设置构造函数并使用this();
传递默认值。 对于您的超类,您可以改用以下这些:
public Person(String name){
this(name, 18, "Atlanta");
}
public Person(String name, int age){
this(name, age, "Atlanta");
}
public Person(String name, int age, String homeTown){
this.name = name;
this.age = age;
this.homeTown = homeTown;
}
对于子类,我将创建一个名为setVars
的私有方法,该方法接受您要使用的三个变量: double avgGPA
, int ID
和String[] classes
。 因此,不必在每个构造函数中设置它们,您的类可能看起来像这样:
public Student(double avgGPA, int ID, String[] classes, String name){
super(name);
setVars(avgGPA, ID, classes);
}
public Student(double avgGPA, int ID, String[] classes, String name, int age){
super(name, age);
setVars(avgGPA, ID, classes);
}
public Student(double avgGPA, int ID, String[] classes, String name, int age, String homeTown){
super(name, age, homeTown);
setVars(avgGPA, ID, classes);
}
private void setVars(double avgGPA, int ID, String[] classes) {
this.avgGPA = avgGPA;
this.ID = ID;
this.classes = classes;
}
我认为这与您将获得的效率差不多,除非您要创建QueenSvetlana的答案建议的静态初始化方法。
与此类似:
public final class Person{
private final String name;
private final int age;
private final String homeTown;
private double avgGPA;
private Person(String name, int age, String homeTown, avgGPA){
this.name = name;
this.age = age;
this.homeTown = homeTown;
this.avgGPA = avgGPA;
}
public static Person createPerson(String name, age, homeTown, avgGPA){
return new Person(name, age, homeTown, avgGPA);
}
public static Person createPersonwithoutHomeTown(String name, age,avgGPA){
return new Person(name, age, "Atlanta", avgGPA);
}
public static Person createPersonwithoutAge(String name,avgGPA){
return new Person(name, 18, "Atlanta", avgGPA);
}
}
不可变对象是在创建后不会更改其状态并且不允许子类化的对象。 从长远来看,不可变的类是有利的。
我认为修改您的Person对象以使用构建器模式会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.