java - 声明类型和实际类型

标签 java

我理解在创建这样的新对象时:

GeomObject tri = new Triangle();

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

Triangle tri = new Triangle();

既然 Triangle 是 GeomObject 的子类,那么 tri 不还是 GeomObject 吗?声明的类型如何影响编译?谢谢

*add: 一个额外的问题:说我有

Integer n1 = new Integer(3);
Object n2 = new Integer(4); 
System.out.println(n1.compareTo(n2));

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

最佳答案

Since Triangle is a subclass of GeomObject, isn't tri still a GeomObject?

是的。使用 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

How does the declared type affect compilation?

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

更多信息:


I thought that n2.compareTo(n1) would work because it would call Object#compareTo method

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

另一方面,n1.compareTo(n2)将无法工作,因为您传递的是 ObjectcompareTo Integer#compareTo 时的方法收到另一个 Integer类类型。

声明时注意:

Object n2 = new Integer(4);
  • 变量类型将是 Object ,不管你初始化为Integer或另一类,例如String .
  • 只有被覆盖的方法才会按照对象引用运行时类型中定义的方式运行,这意味着如果您的 n2变量持有 Integer , 只有类中覆盖的方法 Integer从类 Object将按照 Integer 中的定义运行类,所有其他方法,字段,甚至变量本身都将表现为 Object .如果是Integer类,这些方法是 equals , hashCode toString .
  • 上面提供的链接:“对接口(interface)编程”是什么意思?解释了使用接口(interface)(或抽象类或泛型类)通过泛型接口(interface)来概括工作的好处/classes 而不是直接实现。请注意,在某些情况下,这种方法不适用,例如您当前使用的示例 Object什么时候应该使用 Integer .注意 Object通用(至少对于这种情况),所以我不建议使用 Object至少让你明白自己真正在做什么。

关于java - 声明类型和实际类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18775024/

相关文章:

java - 如何正确清除 Java 中的整个二叉树?

java - Java 的最佳 iCalendar 库?

java - 空指针异常 - Hadoop Mapreduce 作业

java - 如何在图像周围绘制边框

java - 在 tomcat 上运行时 ClassLoader.getSystemResourceAsStream 不工作

java - MyBatis select by id 总是返回零

java - eclipse 在生成 war 文件时包含不必要的工厂类

java - 生命游戏 : how to have "entities" to evolve in parallel?

java - JPA 并发事务

java - 无法获得 2 个月之间的天数 - 具体情况