Java 中的向上转换是如何工作的?
How does upcasting works in Java?
我在 java 中使用了向上转型和向下转型的概念,它们也被称为扩大和缩小。
- 从派生 class 到基础 class 自动发生向上转型(加宽)。即如果它有一个是关系。
- 为了 运行 时间检查,必须明确地进行向下转换。
好的,我明白了概念和一切。但是,它在这种情况下如何工作?
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 = new ObjPair("A",2.2);
- 这是通过向上转换,String 到对象和 Double 到对象,状态存储在 objPair 中。太棒了..!!!
现在,当我执行 objPair.getFirst() 和 objPair.getSecond() 时。它 returns 我 A 和 2.2.
- 它是如何记住字符串和双精度的,widening/upcast 应该记住超class 状态和方法。
- 它如何能够访问子class 类型和值?
记住:内存中的对象是它是什么。如果你创建了一个Double对象,那么它就是一个类似于数值的Double对象。
保存引用的变量使用超类型这一事实不会影响引用的对象到!
在您的示例中,自动装箱在封面下创建了一个 Double 对象,并且getSecond()
returns 对该 Double 对象的引用。
仅此而已。
对象引用的转换不会改变对象。它只是允许将其分配给不同类型的引用。对象本身保持不变。
在你的例子中,它需要两个 Object
引用,它会检查兼容性(没问题),然后将引用设置到 Object
类型的变量中。实例本身不会改变。如果他们有覆盖 Object
的方法,那么将调用覆盖的方法。
因此,当涉及到它打印对象的部分时,它只是使用String.valueOf
,它调用了对象的toString()
方法。从 Object
变量访问的实例实际上是一个 String
对象,并且 String
覆盖 toString()
到 return 本身。 Double
也覆盖 toString
。这些覆盖被调用,因为实例仍然是 String
的实例和 Double
的实例。只有引用是 Object
.
请注意,您还有一个从 double
到 Double
的转换。这个隐式装箱 确实 改变了对象 - 它接受一个原语并从中创建一个新的 Double
。
好了,就是这样,我们举个例子。您有一个名为 Object 的大方框和另一个小方框。如果你把这个小盒子放在你的大盒子里,小盒子和大盒子的所有属性都在大盒子里。
然后在小盒子里,有两根棍子,你将第一根棍子标记为 'A',第二根棍子标记为“2.2”。
现在大盒子可以看到小盒子里面的东西了。现在就在那一刻,小盒子里有两根棍子,并按原样贴上了标签。
(记住对象 class 始终是 java 中每个 class 对象的超 class/parent。
如果您只是测试这段代码:
public class Main {
public Object first;
public Object second;
public static void main (String[] args){
Main a = new Main();
a.first = new String("foo");
a.second = 5;
System.out.println(a.first.getClass().toString());
}
}
输出class java.lang.String
。您可以看到它没有存储为 Object
。这是通过使用 元数据 .
实现的
我在 java 中使用了向上转型和向下转型的概念,它们也被称为扩大和缩小。
- 从派生 class 到基础 class 自动发生向上转型(加宽)。即如果它有一个是关系。
- 为了 运行 时间检查,必须明确地进行向下转换。
好的,我明白了概念和一切。但是,它在这种情况下如何工作?
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 = new ObjPair("A",2.2);
- 这是通过向上转换,String 到对象和 Double 到对象,状态存储在 objPair 中。太棒了..!!!
现在,当我执行 objPair.getFirst() 和 objPair.getSecond() 时。它 returns 我 A 和 2.2.
- 它是如何记住字符串和双精度的,widening/upcast 应该记住超class 状态和方法。
- 它如何能够访问子class 类型和值?
记住:内存中的对象是它是什么。如果你创建了一个Double对象,那么它就是一个类似于数值的Double对象。
保存引用的变量使用超类型这一事实不会影响引用的对象到!
在您的示例中,自动装箱在封面下创建了一个 Double 对象,并且getSecond()
returns 对该 Double 对象的引用。
仅此而已。
对象引用的转换不会改变对象。它只是允许将其分配给不同类型的引用。对象本身保持不变。
在你的例子中,它需要两个 Object
引用,它会检查兼容性(没问题),然后将引用设置到 Object
类型的变量中。实例本身不会改变。如果他们有覆盖 Object
的方法,那么将调用覆盖的方法。
因此,当涉及到它打印对象的部分时,它只是使用String.valueOf
,它调用了对象的toString()
方法。从 Object
变量访问的实例实际上是一个 String
对象,并且 String
覆盖 toString()
到 return 本身。 Double
也覆盖 toString
。这些覆盖被调用,因为实例仍然是 String
的实例和 Double
的实例。只有引用是 Object
.
请注意,您还有一个从 double
到 Double
的转换。这个隐式装箱 确实 改变了对象 - 它接受一个原语并从中创建一个新的 Double
。
好了,就是这样,我们举个例子。您有一个名为 Object 的大方框和另一个小方框。如果你把这个小盒子放在你的大盒子里,小盒子和大盒子的所有属性都在大盒子里。 然后在小盒子里,有两根棍子,你将第一根棍子标记为 'A',第二根棍子标记为“2.2”。 现在大盒子可以看到小盒子里面的东西了。现在就在那一刻,小盒子里有两根棍子,并按原样贴上了标签。 (记住对象 class 始终是 java 中每个 class 对象的超 class/parent。
如果您只是测试这段代码:
public class Main {
public Object first;
public Object second;
public static void main (String[] args){
Main a = new Main();
a.first = new String("foo");
a.second = 5;
System.out.println(a.first.getClass().toString());
}
}
输出class java.lang.String
。您可以看到它没有存储为 Object
。这是通过使用 元数据 .