繁体   English   中英

与其他语言相比,Java中的具体类型和抽象类型

[英]Concrete types and abstract types in Java when compared to other languages

当我遇到以下问题时,我正在准备决赛,并尝试在教科书背面解决运动问题:

在Java中,如果p的具体类型是Foo,则p.getClass()和Foo.class将返回相同的内容。 解释为什么不能保证在Ruby,Python或JavaScript中保持类似的等效性。

任何人都可以阐明这一点。 提前致谢!

答案是强类型编程语言与弱类型编程语言。 在Java(或C ++,C#,VB等)中,必须在编译时明确定义类型。 因此,假设您有一个Java类,如下所示:

class Foo{
    String a;
    public void DoNothing(){}
}

按下编译按钮后,您的班级就固定了; 您不能在运行时更改它。 就是说,假设您有一个变量p,它是Foo的一个实例,您不能执行以下操作:

p.b = 12345;

编译会大喊大叫。 而且您肯定知道,p将具有一个称为“ a”的属性,它必须是一个字符串,以及一个不返回任何类型的方法DoNothing()。

另一方面,JavaScript没有“类”的概念,因为您可以在运行时动态地向对象添加(或删除)属性或字段。 因此,您可以执行以下操作:

var x = {}; //declares a new object, it is empty right now
x["name"] = "Hello World!";
x.doWork = function() { ... };

结果是,直到在运行时执行该行之前,您都不知道变量“ x”是否包含名为“ name”的字段或包含名为“ doWork”的函数。

同样的论点适用于Python和Ruby。

不太确定要问什么。

如果您有python

class Foo(object):
    pass

p = Foo()

那么p.__class__将返回Foo作为对象。 班级名称可以用

p.__class__.__name__

或上课

Foo.__name__

当然,在python中,您可以执行以下操作

class Foo2(object):
    pass

p.__class__ = Foo2

但是,是的,它是动态语言。

因此,最后一种选择非常少见,总的来说我看不出有什么区别。

Ruby,Python和JavaScript都是动态类型化的语言,但这不是静态类型还是动态类型的问题。 相反,我认为这与Java的getClass()是最终的(不能被覆盖)而其他语言没有这样的限制有关:

# Ruby
class Foo
  def class­()
    retur­n Strin­g
  end
end
String.new().class() == String # => true
Foo.new().class() == Foo # => false
# Python
class Foo: pass
class Bar: pass
p = Foo()
p.__class__ == Foo # => True
p.__class__ = Bar
p.__class__ == Foo # => False
// JavaScript
function Foo() { }
function Bar() { }
var p = new Foo();
p.constructor == Foo; // => true
p.constructor = Bar;
p.constructor == Foo; // => false

有趣的是,在Python的情况下,设置__class__成员实际上会影响方法查找,因此可以说p的具体类型现在是Bar ,这并不违反等效性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM