为什么必须在Java中使用.class
来获取Class
对象?为什么不像Ruby中的类名呢?
我知道Ruby
和Java
非常不同。但是,如果你已经输入了类名,实际上必须输入.class
似乎是违反直觉的。
如果课程中有静态方法,则输入MyClass.staticMethod()
,而不是MyClass.class.staticMethod()
。
这可能是一个毫无意义的问题,但我想知道是否有人可以启发我。
答案 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 ++的强大根源,因此其中有很多东西来自于这一思路 - 总有可能“当时看起来像个好主意”