当我遇到无法理解的东西时,我正在练习用Java接口编程。我叫乡村课
class Country implements Comparable
{
int a;
int b;
int c;
public Country(int _a,int _b,int _c)
{
a=_a;
b=_b;
c=_c;
}
public int compareTo(Object obj)
{
/*compares a, b and c and returns number of variables greater for this object.I am not include instanceof check*/
int count=0;
Country other=(Country)other;
if(a>other.a)
count++;
else
if(a<other.a)
count--;
if(b>other.b)
count++;
else
if(b<other.b)
count--;
if(c>other.c)
count++;
else
if(c<other.c)
count--;
return count;
}
public void write()
{
System.out.println(" hello");
}
public static void main(String args[])
{
Object p=new Country(1,2,3);
Object q=new Country(2,3,4);
System.out.println(p.compareTo(q));
}
}
所以这里的问题是,我们是否将某些内容声明为
Object p=new Country(1,2,3);
Object q=new Country(2,3,4);
p.write();
这有效。 但是为什么不
p.compareTo(q)//as done in the main code
为什么需要此演员表?
((Comparable)p).compareTo(q);
答案 0 :(得分:2)
因为您将值存储在类型为Object
的引用中,所以,编译器无法知道它实际上是Country
并且完全实现了Comparable
答案 1 :(得分:2)
这里:
Object p=new Country(1,2,3);
编译器可以知道p
的类型为Country。但是它不知道。
它只会看到您声明p
的类型为Object
。并且Object类没有print()
方法或compareTo()
方法。
多态性(在对象的实际类型上查找方法)在运行时发生,但要确定某些对象是否具有在编译时会发生。并且在这种情况下,编译器决定:p
是Object
,因此它缺少您要调用的方法!