[英]Passing big objects references instead of small objects to methods have any differences in processing or memory consumption?
[英]Why casting direction is big to small in primitive types and small to big with objects?
在 Java 中,我们需要在将 double(memory 尺寸大)转换为 Integer(ZCD691B4957F098CD281Z 尺寸较小)时进行转换
int x = (int) 4.3;
但是在对象的情况下,如果父 class 是“哺乳动物”(在 memory 大小中小),其子类是“人类”(在 memory 大小中大),因为获得了更多属性然后哺乳动物
然后
Mammal m = new Human(); //works without casting
但从小到大的转换
Human h = (Human) m ; // needs casting
提前致谢。
铸造与 object 的大小无关:它与变量的范围有关。
“范围”是指变量可以包含的各种不同值。 如果您从一个变量分配给另一个变量,其范围是第一个变量的超集,则不需要强制转换,因为您知道分配是可以的。 但是,当您将一个变量分配给另一个其范围是子集的变量时,您确实需要进行强制转换,因为分配可能是不可能的。
想象一下,您有两个容器:一个塑料桶和一个金属丝购物篮,大小相同。 显然,任何你可以放在铁丝篮里的东西,你都可以放在浴缸里。 但并不是所有可以放在浴缸里的东西都可以放在篮子里。 一堆苹果,你可以。 但是一堆葡萄干,你不能——它们会从篮子的洞里掉下来。 因此,浴缸可以容纳的物品范围大于篮子可以容纳的物品范围,即使两者的尺寸相同。
在这个类比中,铸造就像检查你移动的东西是否适合新容器。 将东西从篮子移到浴缸时不需要检查,但从浴缸移到篮子时需要检查,否则水果会弄得满地都是。
在您的具体情况下,我们知道每个人都是哺乳动物,但并非每个哺乳动物都是人,因此哺乳动物类型变量的范围大于人类类型变量的范围。 我们也知道 double 的范围(大约 2^1024 - -(2^1024))大于 int 的范围(2^31-1 - -2^31)。 因此,在任何一种情况下从前者分配给后者都需要强制转换,但从后者分配给前者则不需要。
当您使用原始类型时,您必须在有可能丢失信息时显式地强制转换。 例如, long
是 64 位, int
是 32。在int
中转换long
会导致数据丢失(在这种情况下是 32 位)。
在处理对象时,这与多态性有关。 编译器能够确保每个Human
都是Mammal
。 这里没问题。 但无法保证每一个Mammal
都是Human
。 您必须显式转换才能转换引用类型。
您可以将显式转换视为对编译器说“我知道您无法确保此数据转换是安全的,但我知道我在做什么”的一种方式。
在 object 的情况下,没有 memory 的情况。只是多态性起作用。所以你可以将子类 object 变成超类型。
希望你能得到它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.