Java 基类和子类构造函数问题
在过去的几天里,我一直在用Java测试类,从youtube上的Newboston和Java文档中了解它们 我已经创建了以下场景,并就我的几个问题寻求你们男人的女孩过于专业的批评和深入的知识 有两个类,person和person_financial,分别是基类和子类 人员类别:Java 基类和子类构造函数问题,java,class,constructor,Java,Class,Constructor,在过去的几天里,我一直在用Java测试类,从youtube上的Newboston和Java文档中了解它们 我已经创建了以下场景,并就我的几个问题寻求你们男人的女孩过于专业的批评和深入的知识 有两个类,person和person_financial,分别是基类和子类 人员类别: public class person { private String name; private String sex; private int age; private double height; private
public class person {
private String name;
private String sex;
private int age;
private double height;
private double weight;
private double intelligence;
// person constructor arguments order: name, height, weight, age, sex, intelligence
public person(){
this("noname",0,0,0,"undefined",5);
}
public person(String n){
this(n,0,0,0,"undefined",5);
}
public person(String n, double h){
this(n,h,0,0,"undefined",5);
}
public person(String n, double h, double w){
this(n,h,w,0,"undefined",5);
}
public person(String n, double h, double w, int a){
this(n,h,w,a,"undefined",5);
}
public person(String n, double h, double w, int a, String s){
this(n, h, w, a, filterSex(s), 5);
}
public person(String n, double h, double w, int a, String s, double i){
name = n;
height = h;
weight = w;
age = a;
sex = filterSex(s);
intelligence = i;
}
public void setName(String n){
name = n;
}
public void setHeight(double h){
height = h;
}
public void setWeight(double w){
weight = w;
}
public void setAge(int a){
age = a;
}
public void setSex(String s){
sex = filterSex(s);
}
public void setIntel(double i){
intelligence = i;
}
public String getName(){
return name;
}
public double getHeight(){
return height;
}
public double getWeight(){
return weight;
}
public int getAge(){
return age;
}
public String getSex(){
return sex;
}
public double getIntel(){
return intelligence;
}
public String getInfo(){
return String.format("Name: %s,\nSex: %s,\nAge: %d,\nIntelligence: %.2f,"
+ "\nHeight: %.2f,\nWeight: %.2f\n", name, sex, age,
intelligence, height, weight);
}
private static String filterSex(String s){
return ((s.equalsIgnoreCase("male") ||
s.equalsIgnoreCase("female")) ? s : "undefined");
}
}
个人/金融类:
public class person_financial extends person {
private double monies = 0;
public void definePerson(String n, int a, String s, double i, double h, double w){
setName(n);
setAge(a);
setSex(s);
setIntel(i);
setHeight(h);
setWeight(w);
}
public person_financial() {
this(0);
}
public person_financial(double m) {
monies = m;
}
public void depositMonies(double m) {
monies += m;
}
public void withdrawlMonies(double m) {
if (m <= monies) {
monies -= m;
}
}
public double getBalance() {
return monies;
}
}
在person_financial类中,我创建了一个名为definePerson的方法,我使用该方法定义了“person”类的“person”构造函数中定义的所有特征。我确信有一种更专业的方法可以从一个子类中为基类中的变量赋值,我只是不知道有什么
另外,有没有办法从person类调用构造函数来定义“pf1”的特征?例如,不必手动设置每个属性,即pf1.setNamesomething,或pf1.setAge1000000;等或者找个方法帮我做,比如“定义人”
非常感谢您的帮助,
Thank=。您可以使用该调用调用父类的构造函数。它必须是派生类的构造函数中的第一个调用,但您可以像调用任何其他函数一样调用它并传入参数,它将以这种方式调用构造函数。您可以使用该调用调用父类的构造函数。它必须是派生类的构造函数中的第一个调用,但您可以像调用任何其他函数一样调用它并传入参数,它将以这种方式调用构造函数。通常会声明一个类“抽象”,以防止创建泛型对象-根据底部的使用代码,您似乎不希望这样,这很好。请记住,您可以声明一个类抽象 使用类层次结构的最佳方法是确保buzzword alert有用层次结构中的任何类都可以声明为层次结构中的anythin,即在这种情况下,您应该能够从基类person访问具体对象中的任何方法 您的financial_person对象扩展person,但理想情况是拥有一个可以在高级声明并以多态方式调用方法的类。想一想,所有的人都能从你的课上抽出并存入不同的钱,但我要忍受一分钟。 drawMoney方法将存在于个人中,但标记为抽象-迫使子类financial_person和regular_person实现draw_money、deposit_money等 每个类都会有一个适合其实际情况的实现,财务人员可以访问各种特殊账户、折扣等,普通人会有一组更简单但仍然相同的外部行为 然后你可以这样声明:
Person finPerson = new FinancialPerson(... etc.);
Person regPerson = new RegularPerson(....etc);
请注意,现在您可以执行以下代码:
finPerson.drawCash(12300.0);
regperson.drawCase(100.0);
相同的行为
您可以拥有数千人的列表,而不必执行if-then-else或switch语句来执行每个人的更精细的行为
类层次结构的酸性测试是这样的:我的子类真的是“一种”超类吗
换句话说,我的子类是否具有超类的行为
如果不是,您应该仔细考虑类层次结构。这里有一个流行语:利斯科夫替换原理,在这方面我不能比罗伯特做得更好。C.Martin——软件设计大师之一:
在本文中,他展示了当您拥有不合适的层次结构时会发生什么,使用正方形是一种矩形示例
Google模板方法模式是有效使用继承的另一个方面的总结。您将看到,它比大多数人认为简单的继承更强大
还要记住,没有一种模式是万能的。有些人会称类层次结构为邪恶,并告诉您只使用接口;其他人则相反。有很多选择要做,有时它们并不明显
有很多陷阱,而缺少LSP只是其中之一。另一些只是覆盖具体方法的示例,具体类没有标记为final,支持标识字段的易变性,例如equals/hashcode中使用的字段等。想象一下,一旦这些字段已经设置好,银行中的客户对象是否允许在运行时重设名字或帐号
我的答案通常与OO设计、继承等相关,而不是具体的编码问题-希望对您有所帮助。通常会声明一个类“抽象”,以防止创建泛型对象-根据底部的使用代码,您似乎不希望这样,这很好。请记住,您可以声明一个类抽象 使用类层次结构的最佳方法是确保buzzword警告中的任何类 一个有用的层次结构应该可以声明为层次结构中的anythin,也就是说,在这种情况下,您应该能够从基类person访问具体对象中的任何方法 您的financial_person对象扩展person,但理想情况是拥有一个可以在高级声明并以多态方式调用方法的类。想一想,所有的人都能从你的课上抽出并存入不同的钱,但我要忍受一分钟。 drawMoney方法将存在于个人中,但标记为抽象-迫使子类financial_person和regular_person实现draw_money、deposit_money等 每个类都会有一个适合其实际情况的实现,财务人员可以访问各种特殊账户、折扣等,普通人会有一组更简单但仍然相同的外部行为 然后你可以这样声明:
Person finPerson = new FinancialPerson(... etc.);
Person regPerson = new RegularPerson(....etc);
请注意,现在您可以执行以下代码:
finPerson.drawCash(12300.0);
regperson.drawCase(100.0);
相同的行为
您可以拥有数千人的列表,而不必执行if-then-else或switch语句来执行每个人的更精细的行为
类层次结构的酸性测试是这样的:我的子类真的是“一种”超类吗
换句话说,我的子类是否具有超类的行为
如果不是,您应该仔细考虑类层次结构。这里有一个流行语:利斯科夫替换原理,在这方面我不能比罗伯特做得更好。C.Martin——软件设计大师之一:
在本文中,他展示了当您拥有不合适的层次结构时会发生什么,使用正方形是一种矩形示例
Google模板方法模式是有效使用继承的另一个方面的总结。您将看到,它比大多数人认为简单的继承更强大
还要记住,没有一种模式是万能的。有些人会称类层次结构为邪恶,并告诉您只使用接口;其他人则相反。有很多选择要做,有时它们并不明显
有很多陷阱,而缺少LSP只是其中之一。另一些只是覆盖具体方法的示例,具体类没有标记为final,支持标识字段的易变性,例如equals/hashcode中使用的字段等。想象一下,一旦这些字段已经设置好,银行中的客户对象是否允许在运行时重设名字或帐号
我的答案通常与OO设计、继承等相关,而不是具体的编码问题-希望对您有所帮助。谢谢!我在子类的构造函数中添加了super,所有的东西都按照我想要的那样工作!谢谢我在子类的构造函数中添加了super,所有的东西都按照我想要的那样工作!