java中的父/子构造函数

时间:2014-04-14 15:50:45

标签: java inheritance constructor

我一直得到这个错误: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";
}

}

8 个答案:

答案 0 :(得分:2)

你需要确保做出一个改变。更容易添加为您孩子班级的第一条指令:

super(false);

或:

super(true);

取决于对你有意义的事情。

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

r = right;

但它应该是:

right = r;

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

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:1)

根据documentation

  

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

在超类上定义右属性的默认值的影响较小:

public SecurityRights() {
    this(true);
}

答案 3 :(得分:0)

LowRights需要致电super(right);SecurityRights需要添加其他构造函数。

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

答案 4 :(得分:0)

public LowRights(String n) {
    super(false) 
    ... <your sub class constructor code>
}

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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

因此您需要添加对现有构造函数的调用,并且由于您要将right设置为false,请添加调用super(false),然后不再需要此行setRight(false);

答案 7 :(得分:0)

如果没有显式添加超类构造函数,Java会将 super()添加为每个构造函数的第一行(Java中的每个类都默认继承自Object类,并且它只有一个no-arg构造函数)。

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

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

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