给定跟随类层次结构,以下语句的动态和静态类型是什么?
类层次结构:
class Alpha {}
class Beta extends Alpha {}
class Gamma extends Alpha {}
class Epsilon extends Alpha{}
class Fruit extends Gamma{}
class Golf extends Beta {}
class Orange extends Fruit{}
对于以下每个语句,静态类型?动态类型?:
Fruit f = new Fruit();
Alpha a = f;
Beta b = f;
a = b;
Gamma g = f;
我
知道我的答案/问题Fruit f = new Fruit()
将是静态和动态类型的Fruit。
Alpha a = f;
在编译时将为Alpha类型(静态),在运行时将为Fruit类型(动态)。
Gamma g = f;
在编译时将为Gamma类型(静态),在运行时将为Fruit类型(动态)。
但是我不知道其他两个答案。Beta b =
f是一个实例,其中同一超类的两个子类相互分配,因此我不确定在编译时它是Beta类型还是Alpha类型(静态)。而且a =
b是声明后的赋值,所以我不确定答案是什么。有人请帮助我,谢谢!
我急着打这个,所以请原谅任何错别字(我会在有机会的时候再改那些错)。
我知道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
。new Fruit()
您分配给它的对象()恰好是类型Fruit
。
现在,示例代码中的所有其他引用都是a类型的reference to A and sub-classes of it
;b是类型reference to B 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
,即在编译时具有的类型。
对象引用a,b,g和f的类型在编译时确定。它们是静态类型的,在运行时不会更改。
创建的对象的类型new
也在编译时确定。它们也是静态类型的,在运行时不会更改。
这些对象(填充对象引用a,b,g和f) 在运行时 指向,这取决于编译器是否发现语句有效。分配可以更改,但是与对象引用或对象本身是静态还是动态类型无关。
如果要清楚区分动态类型和静态类型,请考虑以下内容:
// Java, statically typed.
int x = 3;
x = 5; // good
x = "hi"; // compiler error
## Ruby, dynamically typed
x = 3 # ok
x = 5 # ok
x = "hi" # still ok
然后,在强类型语言和弱/鸭子类型语言(这两种语言都可以动态类型)之间进行区分。那里有许多关于此主题的文献。
希望能帮助到你。
本文向大家介绍静态和动态网页之间的区别,包括了静态和动态网页之间的区别的使用技巧和注意事项,需要的朋友参考一下 在互联网冲浪的背景下,网络浏览器(客户端)和网络服务器(服务器)之间存在两方通信。现在,为了规范这种通信,有一些协议(其中最常见的是HTTP协议)允许浏览器在其中进行通信向服务器发送HTTP请求,然后服务器将HTTP响应发送到浏览器。 现在,根据发送到浏览器的响应类型,我们可以将该响应分
本文向大家介绍静态和动态测试之间的区别,包括了静态和动态测试之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,测试是任何应用程序或软件交付过程中最重要的阶段,因为测试不仅可以验证应用程序的质量,还可以为开发人员提供改进其产品的机会。 每个应用程序都以某种高级或低级语言进行开发,这意味着已经为其开发编写了一些代码,因此,在为应用程序编写的代码执行的基础上,存在测试的分类,即静态测试和动态
本文向大家介绍静态SQL和动态SQL之间的区别,包括了静态SQL和动态SQL之间的区别的使用技巧和注意事项,需要的朋友参考一下 静态SQL 静态SQL是指那些固定且可以硬编码到应用程序中的SQL语句。由于静态sql是固定查询,因此可以分析和优化这些语句,并且出于安全目的不需要任何特定处理。 动态SQL 动态SQL是指根据用户输入动态生成并在应用程序中运行的SQL语句。Dynamic Sqls帮助开
一个机器或语言是用来计算的,根据计算机模型的定义,其操作的是存储器里的数据,就现在流行的用二进制实现的计算机中(曾出现过三进制计算机),数据本质都是0和1,但机器毕竟是为人服务的,解决的是现实问题,它操作的数据需要有现实的含义,所以基本上所有语言都有类型系统,即便是汇编和机器语言,也有整数和浮点的区别 类型系统是很复杂的理论,值得用一本厚书来写,好点的资料有《类型与程序设计语言》,但我没看懂,因为
本文向大家介绍静态路由和动态路由之间的区别,包括了静态路由和动态路由之间的区别的使用技巧和注意事项,需要的朋友参考一下 静态路由 遵循用户定义的路由的静态路由或非自适应路由,并且直到网络管理员更改路由表后,路由表才会更改。静态路由使用简单的路由算法,并且比动态路由提供更高的安全性。 动态路由 顾名思义,动态路由或自适应路由会在网络发生任何更改或网络拓扑发生更改时更改路由表。在网络更改期间,动态路由
本文向大家介绍静态绑定和动态绑定之间的区别,包括了静态绑定和动态绑定之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解静态绑定和动态绑定之间的区别。 静态绑定 它在编译时解决。 它使用类和字段的类型。 它使用私有,最终和静态方法和变量。 示例:重载 动态绑定 在运行时解决。 虚方法使用此技术。 它使用对象来解决绑定。 示例:方法覆盖。