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

时间:2013-12-08 09:13:34

标签: java javascript python oop object

当我遇到这个问题时,我正在准备我的决赛并试图解决教科书背面的运动问题:

  

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

任何人都可以对此有所了解。提前谢谢!

3 个答案:

答案 0 :(得分:1)

答案是强类型与弱类型编程语言。在Java(或C ++,C#,VB等)中,必须在编译时显式定义类型。所以假设你有一个Java类,看起来像这样:

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

你点击编译按钮的那一刻,你的课就固定了;你无法在运行时更改它。也就是说,假设你有一个变量p,它是Foo的一个实例,你不能这样做:

p.b = 12345;

编译会对你大喊大叫。你知道,确实,p将有一个名为“a”的属性,它必须是一个String,而一个方法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。

答案 1 :(得分:1)

不太确定是什么问题。

如果你有python

class Foo(object):
    pass

p = Foo()

然后p.__class__Foo作为对象返回。可以使用

打印班级名称
p.__class__.__name__

或上课

Foo.__name__

当然在python中你可以做这样的事情

class Foo2(object):
    pass

p.__class__ = Foo2

但是,这是动态语言。

所以最后一个选项很少见,总的来说我看不出差异。

答案 2 :(得分:1)

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,这不违反等价。