我一直得到这个错误: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";
}
}
答案 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)
如果构造函数没有显式调用超类 构造函数,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构造函数 - 这就是您收到此错误的原因。
您可以将
public LowRights(String n) {
super(true)
...
}