Java 继承和重载构造函数

Java 继承和重载构造函数,java,inheritance,Java,Inheritance,我正在和朋友们一起玩java编码,这是我们的书给我们带来的问题之一 使用姓名、年龄构建对象。简单 使用对象职业扩展对象人员,该职业具有职务名称和薪资 使用两个重载,其中一个重载提供了个人和职业的所有信息 需要。简单,用户超级(废话) 第二个重载是给一个人对象和信息,使其专业化 代码大致如下所示: 人客体 public class Person { private String name; private int age; public Person(String n, int a) {

我正在和朋友们一起玩java编码,这是我们的书给我们带来的问题之一

  • 使用姓名、年龄构建对象。简单
  • 使用对象职业扩展对象人员,该职业具有职务名称和薪资
  • 使用两个重载,其中一个重载提供了个人和职业的所有信息 需要。简单,用户超级(废话)
  • 第二个重载是给一个人对象和信息,使其专业化
代码大致如下所示:

人客体

public class Person
{

private String name;
private int age;

public Person(String n, int a)
{
    name=n;
    age=a;
}

}
职业对象

public class Profession extends Person
{

private String jobName;
private int salary;

public Profession(String n, int a, String j, int s)
{
    super(n,a);
    jobName=j;
    salary=s;
}

public Profession(Person p, String j, int s)
{
    //this is where my problem is
}

}

我不知道如何处理person对象。有什么想法吗?我非常感谢你的帮助!这不是为了分数,只是为了好玩,我和一些朋友在班上取得了进步。

我想是这样的:

public Profession(Person p, String j, int s)
{
    super(p.getName(), p,getAge);//asuming you hava getters for name and salary
    jobName = j;
    salary = s;        
}

我是这样想的:

public Profession(Person p, String j, int s)
{
    super(p.getName(), p,getAge);//asuming you hava getters for name and salary
    jobName = j;
    salary = s;        
}

我认为这里更重要的问题是继承应该是对is-a关系的建模。在这个场景中,
Profession
不是
Person
,所以我看不出
Profession
Person
继承的任何原因

职业
之间更合理的关系是has-a,人们有职业前综合症。更现实的类结构是:

class Person {
   private String     name;
   private int        age; 
   private Profession profession;

   public Person(String name, int age) { 
      this.name = name;
      this.age  = age;
   }

   public setProfession(Profession p) {
      this.profession = p;
   }
}

class Profession {
   private String job;
   private int salary;

   public Profession(String job, int salary) {
      this.job = job;
      this.salary = salary;
   }
}
可以对继承关系进行建模的另一个想法是
专业人士
,但我相信上面的建模是最准确的

class ProfessionalPerson extends Person {
   private String job;
   private int salary;

   public ProfessionPerson(String name, int age, String job, int salary) {
      super(name, age);
      this.job = job;
      this.salary = salary;
   } 
}

此外,您应该始终使用描述性变量名,以便阅读您的代码的任何其他人都可以确定哪些变量表示什么。请记住,我遗漏了任何错误处理和默认构造函数。

我认为这里更重要的问题是继承应该对is-a关系建模。在这个场景中,
Profession
不是
Person
,所以我看不出
Profession
Person
继承的任何原因

职业
之间更合理的关系是has-a,人们有职业前综合症。更现实的类结构是:

class Person {
   private String     name;
   private int        age; 
   private Profession profession;

   public Person(String name, int age) { 
      this.name = name;
      this.age  = age;
   }

   public setProfession(Profession p) {
      this.profession = p;
   }
}

class Profession {
   private String job;
   private int salary;

   public Profession(String job, int salary) {
      this.job = job;
      this.salary = salary;
   }
}
可以对继承关系进行建模的另一个想法是
专业人士
,但我相信上面的建模是最准确的

class ProfessionalPerson extends Person {
   private String job;
   private int salary;

   public ProfessionPerson(String name, int age, String job, int salary) {
      super(name, age);
      this.job = job;
      this.salary = salary;
   } 
}

此外,您应该始终使用描述性变量名,以便阅读您的代码的任何其他人都可以确定哪些变量表示什么。请记住,我遗漏了任何错误处理和默认构造函数。

您可以扩展
Person
来创建
ProfessionalPerson
来拥有
professional
(属性)

您可以扩展
Person
来创建
ProfessionalPerson
来拥有
professional
(属性)太

为变量生成getter,然后使用
super(p.getN(),p.getA())
或者实现
Person(Person p)
constructorI喜欢Person(Person p)的想法,但是我该怎么做呢?至于get变量,这绝对有效!我忘了我们已经被教导过了。
publicperson(Person p){this.name=p.name;this.age=p.age;}
Profession
不应该使用
Person
,另一种方法是为变量制作getter,然后使用
super(p.getN(),p.getA())
或者实现
Person(Person p)
constructorI喜欢Person(Person p)的想法,但是我该怎么做呢?至于get变量,这绝对有效!我忘了我们已经被教导过了。
公众人物(Person p){this.name=p.name;this.age=p.age;}
职业
不应该使用
,这是另一种方法是的,关键是。人不应该用职业扩展,但如果formn必须这样做(因为这不是现实生活中的项目,而是一些练习),Robin回答。@i或任务要求“用职业扩展对象人”(即包括职业)是的,这是关键。人不应该用职业扩展,但如果formn必须这样做(因为这不是现实生活中的项目,而是一些练习),Robin回答。@Igor任务要求“用职业扩展对象人”(即包括职业)让
Profession
扩展和包含
Person
是完全不合逻辑的,而这不是任务要求OP做的事情让
Profession
扩展和包含
Person
是完全不合逻辑的,而不是任务要求OP做的事情