在Java中,有没有办法在同一个构造函数中调用this()和super()?

时间:2014-02-11 14:32:38

标签: java

我有两个课程如下。我想在单个构造函数TestEmployee()中访问this()和super()构造函数。当前方法无法编译。在Java中是否还有其他方法,因此我可以在同一个构造函数的主体中调用this()和super()。

class Employee{
   double salary;
   Employee(double salary){
      this.salary = salary;
   }
}
class TestEmployee extends Employee{
   TestEmployee(){
        super(1000000);
        this(10000);
   }
   double bonus;
   TestEmployee(double bonus){
       this.bonus = bonus;
   }
}

6 个答案:

答案 0 :(得分:3)

显然不是,super和this都必须是构造函数体的第一个语句。并且只能有一个第一个语句

答案 1 :(得分:0)

这没有意义,因为TestEmployee有一个工资,由于Employee来自TestEmployee,因此传入并发送到基类Employee。奖金是补偿的一个单独部分,将单独存储。理想情况下,Employee基类中有一个不同的构造函数,允许传递salarybonusTestEmployee可以访问。

答案 2 :(得分:0)

正如其他人所说的那样,你无法按照自己想要的方式做到这一点。但是,你可以做的是设计你的类有点不同,以便你可以达到同样的目标。

class Employee{
   double salary;
   Employee(double salary){
      this.salary = salary;
   }
}
class TestEmployee extends Employee{
   TestEmployee(double salary, double bonus){
        super(salary);
        this.bonus=bonus;
   }

   double bonus;
}

然后,如果你想要一个默认的TestEmployee构造函数,你可以这样做:

TestEmployee() {
  this(1000000,10000);
}

答案 3 :(得分:0)

为了防止代码重复,您可以定义一个非静态方法,它为您的所有构造函数执行所有initlization块。您可以在调用super()下面包含此方法来初始化您的对象。但缺点是..它可以从类中的任何其他方法调用。所以它不是一个好的设计模式

class TestEmployee extends Employee{

       double bonus;

       TestEmployee(){
            super(1000000);
            intialize(10000);
       }

       TestEmployee(double bonus){
          super(bonus);
           intialize(bonus);
       }
       private void intialize(double bonus)
       {
           this.salary = bonus;
       }
    }

答案 4 :(得分:0)

您不能将这两个调用放在同一个构造函数中,因为在调用父类时,这两个调用都必须放在构造函数的最前面。当您有额外的参数时,可以在同一构造函数中使用this和super。就像这个例子:

class TestEmployee extends Employee{
double: age;
   TestEmployee(double salary, double age){
        super(1000000);
        this.age=age;
   }
Or when you are using a Chaining Constructor, for example:
public class Employee{
String name;
double salary;
double age;
 public Employee()
    {
        this("James Bond", 34000);
    }

    public Employee(String n, double s)
    {
       this("Ana", 34000, 23);
    }
public Employee(String n, double s, double age)
    {
        name = n;
        salary = s;
        this.age=age;

    }

答案 5 :(得分:-1)

正如其他人所说,你为什么甚至想要。没有意义。
你可以通过调用另一个构造函数来伪造它,而构造函数又调用它的超类构造函数。但是,如果调用另一个构造函数的唯一原因是转发到另一个超类构造函数而不是那个被称为implicity的构造函数,那么几乎可以肯定你的设计存在严重错误。