public interface AA{
public static final String value = "123456";
}
public class B implements AA{
@Override
public boolean equals(Object obj){
if(obj==null)
return false;
if(this==obj)
return true;
if(!this.className().equals(obj.className()))
return false;
B b = (B)obj;
if(this.value.equals(b.value))
return true;
return false;
}
}
测试这样写:
public static void main(String[] args){
AA a = new B();
AA b = new B();
System.out.println(a.equals(b));
}
编译和运行都没错,控制台打印true;
但是a和b 都是AA接口类型的引用,JAVA编译的时候虚似调用要检测AA类型里有equals()方法才能正常编译。
这就说明AA接口里有euqals()方法,这说明接口也继承Object。
大虾们帮解释下
public static final String value = "123456";
}
public class B implements AA{
@Override
public boolean equals(Object obj){
if(obj==null)
return false;
if(this==obj)
return true;
if(!this.className().equals(obj.className()))
return false;
B b = (B)obj;
if(this.value.equals(b.value))
return true;
return false;
}
}
测试这样写:
public static void main(String[] args){
AA a = new B();
AA b = new B();
System.out.println(a.equals(b));
}
编译和运行都没错,控制台打印true;
但是a和b 都是AA接口类型的引用,JAVA编译的时候虚似调用要检测AA类型里有equals()方法才能正常编译。
这就说明AA接口里有euqals()方法,这说明接口也继承Object。
大虾们帮解释下
这个类public class B implements AA默认还是要继承自Object类.
对接口AA和类B的class文件分别反编译可以看的出来,在class文件里,B会自动加上extends java.lang.Object,而接口不会.
就如:
public class B{
public void method(){
System.out.println("class B method()!");
}
}
如果A是这样的:
public classA extends B implements A{
}
那么
AA a = new classA();
则a.method();通过不过编译;
a.equals();就能通过编译;
但是指向它的引用是接口类型的呀,在编译的时候要先检测引用类型里是否有equals()方法才能正常通过编译。
就如:
public class B{
public void method(){
System.out.println("class B method()!");
}
}
如果A是这样的:
public class A extends B implements AA{
}
那么
AA a = new classA();
则a.method();通过不过编译;
a.equals();就能通过编译;
因为从语法上讲,interface 可以extends 其他的接口,但是不能extends别的类。
接口中不存在任何方法 接口也没有对象 你说的接口对象只是引用类的对象而已。所以有equals()方法
public boolean equals(Object obj){
System.out.println(obj);
return false;
} 那就没有相等的含义。
list.equals(null);
编译的时候为什么不报错?