簡體   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