while
我希望var guess = prompt("Enter A Value Guessing Between 1 to 10 !"),
guessint = parseInt(guess, 10),
random = Math.floor(Math.random() * 10) + 1;
while (guessint !== random) {
if (guessint > random) {
guessint = parseInt(prompt("Try Again with value LESSER than " + guessint), 10);
} else {
guessint = parseInt(prompt("Try Again With Valur GREATER than " + guessint), 10);
}
}
document.write("Guessed Correct");
被选为public class Imp1 implements Inter1 {
private int num;
@Override
public void apply() {
num++;
}
public void doubler() {
num = num * 2;
}
public boolean equals(Imp1 o) {
if (!(o instanceof Imp1))
return false;
return o.num == num;
}
public int getNum() {
return num;
}
public static void main(String[] args) {
final Inter1 a = new Imp1();
final Imp1 b = new Imp1();
a.apply();
b.apply();
System.out.println("a equals b " + a.equals(b));
System.out.println("b equals a " + b.equals(a));
}
}
和equals(Imp1 o)
的最佳候选人。为什么不是这里的情况?
更多细节 - 此代码输出两次错误,我想知道为什么?
a和b保存Imp1对象,因此调用与Imp1实例的equals作为param应调用a.equals(b)
,这比b.equals(a)
更合适,但我看到equals(Imp1 o)
被调用,最后代码打印假两次而不是两次真。
答案 0 :(得分:2)
方法重载分辨率由参数的编译时类型决定,因为编译器在编译时选择最佳匹配方法签名。
只有在传递给方法的参数的编译时类型为equals(Imp1 o)
或子类Imp1
时,才能选择 Imp1
。
a
不符合此条件,因此b.equals(a)
会调用Object
的{{1}}。
对于equals
,由于编译时类型a.equals(b)
不是a
,因此无法调用Imp1
方法(除非您将其强制转换为equals(Imp1 o)
1}}),因此它只能选择Impl1
的{{1}}。
Object
将致电equals
。
答案 1 :(得分:0)
问题是你没有真正覆盖Object超类的等号!!
这是执行此操作的正确方法:
public class Imp1 implements Inter1 {
private int num;
@Override
public void apply() {
num++;
}
public void doubler() {
num = num * 2;
}
@Override//<-----need to override the equals of the superClass Object!!!
public boolean equals(Object o) {//<---must be Object!!!
if (!(o instanceof Imp1))
return false;
return ((Imp1)o).num == num;
}
public int getNum() {
return num;
}
public static void main(String[] args) {
final Inter1 a = new Imp1();
final Imp1 b = new Imp1();
a.apply();
b.apply();
System.out.println("a equals b " + a.equals(b));
System.out.println("b equals a " + b.equals(a));
}
}
OR:
public class Imp1 implements Inter1 {
private int num;
@Override
public void apply() {
num++;
}
public void doubler() {
num = num * 2;
}
@Override //<---------------need to be implemented from the interface!
public boolean equals(Inter1 o) {//<----the class must to be from the specific interface!!!
if (!(o instanceof Imp1))
return false;
return ((Imp1)o).num == num;//<-----must to cast the object to the specific object in the "if"
}
public int getNum() {
return num;
}
public static void main(String[] args) {
final Inter1 a = new Imp1();
final Imp1 b = new Imp1();
a.apply();
b.apply();
System.out.println("a equals b " + a.equals(b));
System.out.println("b equals a " + b.equals(a));
}
}