与其他语言相比,Java中的具体类型和抽象类型
Concrete types and abstract types in Java when compared to other languages
我正在为期末考试做准备,并试图解决课本背面的练习问题,这时我遇到了这个问题:
在Java中,如果p的具体类型是Foo,则p.getClass()和Foo.class将返回相同的东西。解释为什么类似的等价物不能保证使用Ruby、Python或JavaScript。
有人能解释一下吗。提前感谢!
getClass()
是最终的(不能重写),而其他语言没有这样的限制:
# Ruby
class Foo
def class()
return String
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
,这并不违反等价性。
答案是强类型编程语言与弱类型编程语言。在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。
不太确定要问什么。
如果你有在python
class Foo(object):
pass
p = Foo()
则CCD_ 5将返回CCD_。类名可以用打印
p.__class__.__name__
或在级
Foo.__name__
当然,在python中,你可以做一些类似的事情
class Foo2(object):
pass
p.__class__ = Foo2
但是的,这是一种动态语言。
所以最后一种选择是非常罕见的,总的来说我看不出有什么不同。
相关文章:
- ES6 类扩展本机类型使实例在某些 JavaScript 引擎中出现意外行为
- 子类化 Meteor.users() 以获得不同的用户类型
- 按类划分的元素数组 - 类型错误:$.id 不是一个函数
- Ext 无法从基/抽象类中获取静态值
- 抽象数据类型等效于类型
- 有没有一种方法可以在泛型(<T>)函数/类(Typescript)中获取泛型类型的名称
- 与其他语言相比,Java中的具体类型和抽象类型
- 如何查找使用Dojo声明创建的类的类型
- 如何创建具有类类型的数组并更改 html id
- 如何在打字稿中声明私有类成员的参数和返回类型
- 如何使用闭包编译器在 javascript 中注释扩展泛型类型的类
- 将 MongoDB 文档强制转换为强类型类
- 根据元素类型或类名查找前一个DOM元素
- 如何在javascript中扩展抽象类,并为闭包编译器进行注释,但不使用闭包库
- Java Nashorn: JS中的抽象类,依赖于JS函数
- jQuery类型的类结构
- Jquery元素类型和类名选择器
- 如何在Enzyme中测试抽象类和/或传递隐式变量
- 抽象类方法调用的for-of循环
- jquery按类型和类获取html元素