2015-12-25 27 views
1

时说:Java中的引用对象有不同的类型吗?

String str = "hello"; 
    Object obj = str; 
    System.out.println(str==obj); 

结果是真实的,因为它指向内存中的相同的对象,这是有道理的。但如果我说:

obj.indexOf("h"); 

或者任何子类的方法,我得到“无法找到符号”。它们仍然指向同一个对象,所以在编译期间发生了什么,使得不同类型的引用对象彼此不同?

回答

3

Object类型引用只知道属于其公共接口一部分的方法。

你要投,如果你知道Object引用是一个String类型:

int index = ((String) obj).indexOf("h"); 
+0

酷,所以这是否检查在编译时只服务宗旨在运行之前捕捉的错误?还是它为编译器/ JVM提供了更重要的目的? – rb612

+2

@ rb612没有。如果'obj'是'Object'类型,编译器无法知道存储在该变量中的值的确切类型。现在,如果你知道'obj'在编译时包含'String',你可以告诉编译器“这实际上是一个'String'” - 编译器不知道这一点,所以你必须告诉它。如果它实际上不是一个'String',但你试着告诉编译器它会在运行时抛出'ClassCastException'。 Downcasting用于编译时开发 –

+0

@VinceEmigh,这很有意义!谢谢!因此,当我们尝试一个无效的转换时,即使我们实际上没有调用该类没有的方法,我们也会得到一个'ClassCastException'。我们实际上并没有遇到错误,因为如果我们只是说'int number =“hello”',我们实际上并没有在字符串上调用整数方法,但我们仍然得到这个异常。这是为什么? – rb612

0

苹果和梨。

身份检查==在运行时执行。和有效和罚款。

的结构obj.indexOf...是作为类对象的编译时错误只是没有一个方法indexOf

如果你告诉编译器(通过强制手段)obj是否包含字符串,就可以得到有效的代码

((String)obj).indexOf("h"); 

将编译再次

相关问题