为什么必须在Java中使用.class来获取Class对象?为什么不像Ruby中的类名呢?

时间:2015-12-31 15:26:25

标签: java

为什么必须在Java中使用.class来获取Class对象?为什么不像Ruby中的类名呢?

我知道RubyJava非常不同。但是,如果你已经输入了类名,实际上必须输入.class似乎是违反直觉的。

如果课程中有静态方法,则输入MyClass.staticMethod(),而不是MyClass.class.staticMethod()

这可能是一个毫无意义的问题,但我想知道是否有人可以启发我。

2 个答案:

答案 0 :(得分:10)

因为类和变量在Java中不共享命名空间,这意味着您可以拥有与现有类同名的变量。这句话:

String Integer = "Integer";

完全合法,即使有a class Integer,也会创建一个名为Integer的新String变量。

一个示例显示使用类名作为Class对象将是不明确的:

Class Integer = "Integer".getClass(); 
System.out.println(Integer.getName());

这会打印“java.lang.Integer”还是“java.lang.String”?

但是,如果变量Class Integer只会影响class Integer的定义

,该怎么办?

你认为阴影是好事吗?它经常造成混乱和令人讨厌的惊喜。但这当然值得商榷。此外,new Integer(42)(构造函数String(int)未定义)现在变为运行时错误而不是编译时错误。

但是如果我们只是禁止在现有类之后命名变量呢?

标准库中有很多类。这确实会缩小可用变量名称的命名空间。

但是如果我们只禁止在当前.java文件中import的类之后命名变量呢?

...然后你添加一个新的导入,你的代码不再编译了?

答案 1 :(得分:2)

我认为有几个原因。第一个在peeskillet的评论中提到,编译器必须处理新类型对象的实例化:

MyClass myClassInstance = new MyClass();

另一个是实际上有一个对象(Class<?>)代表一个类的类 - 它不仅仅是“那个类”。这可以用作其他方法的参数,因此您需要一种方法来区分创建新实例的尝试(上面)和对象的Class<?>的引用。

这是否是一个好主意,或者它是否可以简化是肯定有争议的:)注意Java起源于C / C ++的强大根源,因此其中有很多东西来自于这一思路 - 总有可能“当时看起来像个好主意”