栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java中动态和静态类型分配之间的区别

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中动态和静态类型分配之间的区别

我急着打这个,所以请原谅任何错别字(我会在有机会的时候再改那些错)。

我知道Fruit f = new Fruit()将是静态和动态类型的Fruit。

我认为您将术语

static and dynamic
类型与编译时类型和运行时类型混淆了(或者像在C
++中那样,当您将类型A的对象的地址分配给类型B的指针,而B是A的父类时。 )

除反射技巧外,Java中没有动态类型。一切都是在编译时静态键入的。对象在运行时的类型与其被编译为的对象相同。

发生的事情是,您将对象引用(a,b,c,f)与堆中实例化的实际对象(使用

new
。创建的任何对象)相混淆。

在Java中,

f
是对象引用,而不是对象本身。此外,的参考类型
f
Fruit and sub-classes of it
newFruit()
您分配给它的对象()恰好是类型
Fruit

现在,示例代码中的所有其他引用都是a类型的

reference to A and sub-classes of it
;b是类型
reference toB and sub-classes of it
; 等等等

请记住这一点,因为它非常重要。

αa = f; 在编译时将为Alpha类型(静态),在运行时将为Fruit类型(动态)。

a是“对类型A和子类的引用”类型。f是“对水果和子类的引用”类型。

f指向的对象的类型为“水果”。当您说“ a = f”时,您并未将“ f”分配给“ a”。您说的是“现在将引用f当前所指的事物”。

那么,分配之后,

a
引用的是什么?分配时指向
Fruit
的对象引用类型的对象
f

请记住,a,b,g,f不是对象。它们是对由

new
操作员以一种或另一种方式创建的对象的引用或句柄。

诸如a,b或f之类的引用变量与使用创建的对象是不同的野兽

new
。但是恰好前者可以指向后者。

在运行时使用new创建的对象的类型与在编译时确定的对象的类型相同。

伽玛g = f; 在编译时将为Gamma类型(静态),在运行时将为Fruit类型(动态)。

同上。变量

g
是类型的对象引用
reference to type Gamma and sub-classes
。在此分配中,
g
使其指向指向的同一对象
f
。该对象的类型是什么?编译时给出的结果是:Fruit。

但是我不知道其他两个答案。Beta b =
f是一个实例,其中同一超类的两个子类相互分配,因此我不确定在编译时它是Beta类型还是Alpha类型(静态)。

b是类型

reference to type Beta and sub-classes of it
。它在分配后指向的对象
b =f
的类型为
Fruit
,即在编译时具有的类型。

  1. 对象引用a,b,g和f的类型在编译时确定。它们是静态类型的,在运行时不会更改。

  2. 创建的对象的类型

    new
    也在编译时确定。它们也是静态类型的,在运行时不会更改。

  3. 这些对象(填充对象引用a,b,g和f) 在运行时 指向,这取决于编译器是否发现语句有效。分配可以更改,但是与对象引用或对象本身是静态还是动态类型无关。

如果要清楚区分动态类型和静态类型,请考虑以下内容:

// Java, statically typed.int x = 3;x = 5; // goodx = "hi"; // compiler error## Ruby, dynamically typedx = 3 # okx = 5 # okx = "hi" # still ok

然后,在强类型语言和弱/鸭子类型语言(这两种语言都可以动态类型)之间进行区分。那里有许多关于此主题的文献。

希望能帮助到你。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569330.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号