声明的类型和实际类型

xhe*_*nry 1 java

我知道在创建这样的新对象时:

GeomObject tri = new Triangle();
Run Code Online (Sandbox Code Playgroud)

更通用,并允许更多的可恢复性,但是当像这样创建tri时会发生什么:

Triangle tri = new Triangle();
Run Code Online (Sandbox Code Playgroud)

由于Triangle是GeomObject的子类,所以还不是GeomObject吗?声明的类型如何影响编译?谢谢

*补充:另一个问题:说我有

Integer n1 = new Integer(3);
Object n2 = new Integer(4); 
System.out.println(n1.compareTo(n2));
Run Code Online (Sandbox Code Playgroud)

我在Eclipse上尝试了这个,即使我用n2反转n1,我也会遇到错误.我认为n2.compareTo(n1)会起作用,因为它会调用Object compareTo方法,因为Integer是一个对象的实例,所以它是可以通过的,但事实并非如此.你能解释一下吗?

Lui*_*oza 9

既然Triangle是子类GeomObject,还不triGeomObject

是的.使用instanceof运算符来测试:

System.out.println( (tri instanceof Triangl) ); //prints true
System.out.println( (tri instanceof GeomObject) ); //prints true
System.out.println( (tri instanceof Object) ); //prints true because every class extends from Object
Run Code Online (Sandbox Code Playgroud)

声明的类型如何影响编译?

它不会影响任何事情,只是会使你的代码不灵活,以防你需要使用另一个GeomObject不是的实现Triangle.

更多信息:


我认为这n2.compareTo(n1)会起作用,因为它会调用Object#compareTo方法

这是不正确的,因为Object类没有compareTo方法.

另一方面,n1.compareTo(n2)由于在接收另一个类类型时传递ObjectcompareTo方法,因此无法工作.Integer#compareToInteger

请注意,在声明时:

Object n2 = new Integer(4);
Run Code Online (Sandbox Code Playgroud)
  • Object无论你是初始化它Integer还是另一个类,变量类型都是如此String.
  • 只有覆盖的方法将表现为在对象引用运行时类型定义,这意味着如果你的n2变量保存的Integer,只能在类中重写的方法Integer从类Object将表现为在定义的Integer类,其他所有方法,字段,甚至变量本身将表现为Object.在Integer课堂上,这些方法是equals,hashCodetoString.
  • 上面提供的链接:"编程到接口"是什么意思?解释了使用接口(或抽象类或泛型类)通过通用接口/类而不是直接实现来概括工作的好处.请注意,在某些情况下,此方法不适用,例如您当前使用Object时的示例Integer.请注意,Object通用了(至少在这种情况下),所以我不建议Object至少直接使用你理解你真正在做什么.