【问题标题】:Parent/Child Constructor in javajava中的父/子构造函数
【发布时间】:2014-04-14 15:50:45
【问题描述】:

我不断收到此错误:boolean;发现:没有参数;原因:实际参数列表和形式参数列表的长度不同;

我知道为什么会这样,因为我的超类和子类中的构造函数不匹配......但如果可能的话我不想对它们进行更改,因为它会破坏我的其他类的其余部分,如果我这样做需要进行更改 我宁愿只更改 LowRights 类。有人能指出我正确的方向吗?

public class LowRights extends SecurityRights
{
    private String name;

    public LowRights(String n){
        this.name = n;
        boolean right = getRight(); // Added
        setRight(false); // Added
    }

    public boolean setRight(boolean right){
        return right;
    }

    public String getName(){
        return name;
    }

    public static void main(String[] a){
    LowRights s= new LowRights("Lisa");
    System.out.print(s.getName() +" "+s.getSecret());                
  }

}

这是我的超级班:

public class SecurityRights
{
private boolean right;
private boolean canreadSecret;
String SECRET="the secret is 42";



public SecurityRights(boolean r)
{
 r = right;
 if (r) canreadSecret=true; else canreadSecret=false;
}

boolean getRight(){
 return right;
}

boolean canReadSecret(){
 return canreadSecret;
}

String getSecret(){
 if (canreadSecret) return SECRET; else return "access denied";
}

}

【问题讨论】:

    标签: java inheritance constructor


    【解决方案1】:

    您确实需要进行一项更改。更容易在您的子班中添加以下指令作为第一条指令:

    super(false);
    

    或:

    super(true);
    

    取决于什么对你有意义。

    顺便说一句,在你父母的构造函数中,你有这个:

    r = right;
    

    但应该是:

    right = r;
    

    否则,您将丢弃构造函数中传递的值。

    【讨论】:

      【解决方案2】:

      在子类构造函数中,对父类构造函数的调用始终是第一行。即使你不写它,它也在那里。所以你的代码实际上是这样的:

      public LowRights(String n){
              super(); //implied no-args parent-class constructor
              this.name = n;
              boolean right = getRight(); // Added
              setRight(false); // Added
      }
      

      问题是您的父类没有无参数构造函数。你必须给它一个布尔值。如何确定布尔值取决于您。这将传递错误:

      public LowRights(String n){
              super(false); //calls the parent-class constructor
              this.name = n;
              boolean right = getRight(); // Added
              setRight(false); // Added
      }
      

      这只是一个通用示例,因为您的很多代码没有意义。例如,您的父类构造函数实际上并没有设置正确的布尔值。

      【讨论】:

      • 我不认为你的第三个解决方案会起作用,因为你在创建它之前从类中调用方法
      • 没错。已编辑。
      【解决方案3】:

      根据documentation

      如果构造函数没有显式调用超类 构造函数,Java 编译器会自动插入对 超类的无参数构造函数。如果超类没有 有一个无参数的构造函数,你会得到一个编译时错误。 Object 确实有这样的构造函数,所以如果 Object 是唯一的 超类,没问题。

      影响较小的方法是为超类的右属性定义一个默认值:

      public SecurityRights() {
          this(true);
      }
      

      【讨论】:

      • 哦,对不起,是这个 * facepalm *
      【解决方案4】:

      LowRights 需要调用super(right); 或者SecurityRights 需要添加另一个构造函数。

      子类需要调用其父构造函数。

      【讨论】:

      • 谢谢。感谢其他所有人的回答。
      【解决方案5】:
      public LowRights(String n) {
          super(false) 
          ... <your sub class constructor code>
      }
      

      【讨论】:

        【解决方案6】:

        出现错误,是因为构造函数 LowRights(String n) 调用了 SecurityRights 的默认构造函数(如果没有指定调用哪个父构造函数,Java 将 super() 作为构造函数的第一行添加)。但是 SecurityRights 中没有默认构造函数。默认构造函数是没有参数的构造函数:SecurityRights()。因此,您可以将默认构造函数添加到 SecurityRights 类或指定在 LowRights 中必须调用的构造函数:super(true)。

        【讨论】:

          【解决方案7】:

          每个类在创建时总是调用其超类的构造函数,
          在你的例子中

           public LowRights(String n){
                      this.name = n;
          ...}
          

          您实际上是在调用默认构造函数 super(),它在您的超类中不存在

          所以你需要添加对现有构造函数的调用,并且因为你想将right设置为false,所以添加调用super(false)然后这行setRight(false);就不再需要了

          【讨论】:

            【解决方案8】:
            如果没有显式添加超类构造函数,

            Java 添加 super() 作为每个构造函数的第一行(Java 中的每个类都默默地继承自 Object 类,并且它只有一个无参数构造函数)。

            SecurityRights 类不提供无参数构造函数 - 这就是您收到此错误的原因。

            您可以将无参数构造函数添加到 SecurityRights 类,或者将带有布尔参数的超构造函数调用添加到 LowRights(String n) 构造函数。

            public LowRights(String n) {
               super(true) 
               ...
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-02-28
              • 2018-01-31
              • 1970-01-01
              • 1970-01-01
              • 2011-03-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多