繁体   English   中英

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

[英]Why do you have to use .class in Java to get the Class object? Why not just the class name like in Ruby?

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

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

如果类上有静态方法,则键入MyClass.staticMethod() ,而不是MyClass.class.staticMethod()

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

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

String Integer = "Integer";

是完全合法的,并创建一个名为Integer的新String变量,即使有一个类Integer

一个示例显示使用类名作为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类之后命名变量呢?

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

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

MyClass myClassInstance = new MyClass();

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

这是一个好主意,还是可以简化,肯定有争议:)请注意,Java起源于C / C ++的强大根源,所以其中有很多东西都来自于这种思维方式 - 总是存在“当时看起来像个好主意”的可能性

暂无
暂无

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

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