我正在使用Java中的上转换和下转换的概念,这也称为扩大和缩小。
UpCasting(Widening)从派生类自动转换为基类。即它是否具有is-a关系。
向下转换必须明确进行以进行运行时检查。
好的,我了解了概念和所有内容。但是,在这种情况下它如何工作?
public class ObjPair {
Object first;
Object second;
public ObjPair(Object first, Object second) {
this.first = first;
this.second = second;
}
public Object getFirst() {
return first;
}
public Object getSecond() {
return second;
}
public static void main(String[] args) {
ObjPair objPair = new ObjPair("A",2.2); // Goes widning conversion
System.out.println(objPair.getFirst());
System.out.println(objPair.getSecond());
}
}
ObjPair objPair =新的ObjPair(“ A”,2.2);
这是通过向上转换,从字符串到对象,从双精度到对象,状态存储在objPair中。大..!!!
现在,当我执行objPair.getFirst()和objPair.getSecond()时。它返回我A和2.2。
它如何记住字符串和双精度字,加宽/转换应该记住超类的状态和方法。
如何访问子类的类型和值?
最佳答案
转换对象引用不会更改对象。它只是允许将其分配给其他类型的引用。对象本身保持不变。
在您的情况下,它需要两个Object
引用,它检查兼容性(在那里没有问题),然后在Object
类型的变量中设置引用。实例本身不会更改。如果它们具有覆盖Object
的方法,则将调用覆盖方法。
因此,当涉及到打印对象的部分时,它仅使用String.valueOf
,它调用对象的toString()
方法。从Object
变量访问的实例实际上是一个String
对象,并且String
覆盖toString()
以返回自身。 Double
也将覆盖toString
。调用这些替代,因为该实例仍然是String
的实例和Double
的实例。仅引用为Object
。
请注意,您还从double
强制转换为Double
。这种隐式装箱确实会更改对象-它采用原语并从中创建新的Double
。