簡體   English   中英

有人可以解釋一下java中的.getClass()方法嗎?

[英]Could someone explain me the .getClass() method in java

我目前正在大學讀一堂java課。 這是我的第一個編程課程,我偶然發現了一些我無法理解的內容。 據我所知,有兩種比較變量的方法。 第一個是使用==!=<>=<>=符號表示PRIMITIVE變量,如int,double等。 第二種方法是使用.equals()方法作為引用類型。 現在這是我的問題:

當我使用.getClass()方法時,我可以使用.equals()方法和== / !=方法比較兩個類。 因為我可以使用== / !=符號,所以我認為返回對象類的.getClass()方法必須返回基本類型。 但是在google上搜索我在java API中發現這個方法的唯一方法就是它返回一個對象的類。 它沒有告訴我它返回的變量類型。 這種方法究竟是如何工作的。 它返回了什么? 我試着問老師,但她不知道。 謝謝!

首先需要知道==!=如何比較兩個操作數。 ==!=不能用於比較引用類型的原因是它們實際上比較了兩個引用類型變量的內存地址

所以,如果我有兩個字符串:

String x = "Hello";
String y = x;

由於xy在執行第二行后共享相同的內存地址,因此x == y計算結果為true。

getClass()方法也是如此。 getClass()方法將對象的Class<T>作為Class<T>對象返回。 問題是,為什么評估為真:

x.getClass() == y.getClass()

答案很簡單。 因為xy都是String類型。 因此調用getClass將返回相同的實例。 這意味着兩個返回的對象共享相同的內存地址。

“但是當我用==運算符比較具有相同字符的字符串時,它的計算結果為false!” 你喊道。

這是因為字符串位於不同的內存地址。 但是,如果它們所代表的類是相同的,則getClass將返回的類始終位於相同的內存地址。 這是由於ClassLoader工作方式。 但我不是那么專家。

您只需要知道getClass返回的對象在它們所代表的類相同的情況下位於相同的內存地址。

比較器==!=以身份的方式比較相等。 那么這對於原語是如何工作的是顯而易見的。 但是它也可以用於比較對象。 然而,大多數情況下,這不會按預期工作。 有一些例外:

String s存儲為文字,因此如果您定義兩個包含相同值的String實例,則它們使用相同的文字。 可以想象這兩個實例指向相同的內存位置。

Enum基本上是常量的集合,因此枚舉值可以是相同的實例,也可以不是。 它不能是枚舉具有相同的值而是另一個實例。

Class對象也是如此,這是調用getClass()時得到的。 第一次加載* .class文件時, ClassLoader創建一個Class對象。 在后續調用中,使用相同的Class對象。 因此可以將Class對象與==!=進行比較。 但請注意,如果A.class由兩個不同的ClassLoader ,則從它們返回的類對象不屬於同一個實例。

getClass()返回Class類的實例(對象)。 由於每個Java類都有一個Class類的實例,如果兩個對象屬於同一個類,那兩個對象的getClass()將返回相同的isntance,因此您可以使用==進行比較,因為==當應用時引用類型確定兩個引用是否引用同一實例。

.getClass方法只返回對象的類。 聲明對象的新實例時,它將引用一個類。 每個jvm只能有一個類,但是多個對象引用它。 所以當你得到兩個對象的類時,它們可能指的是同一個類!

多態性是java最重要的特性之一。 例如:

//this shows one use of getclass method.

public class Main {

    public static void main(String[] args) {
        Main m = new Main();
        Animal animal = new Animal();
        Human human = new Human();
        m.dosomething(animal);//print animal
        m.dosomething(human);//print human
    }

    private void dosomething(Animal an){
        System.out.println(an.getClass().toString());
        }

    }

class Human extends Animal{

    private void dance(){
        }
}

class Animal{

    private void eat(){
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM