2016-03-26 3 views
2

В настоящее время я беру класс java в университете. Это мой первый класс программирования, и я наткнулся на то, что я просто не могу понять. Как я узнал, существует два способа сравнения переменных. Первый использует ==, !=, <, >, =<, >= Знаки PRIMITIVE, такие как int, double и т. Д. а второй способ - использовать метод .equals() для ссылочного типа. Теперь вот мой вопрос:Может ли кто-нибудь объяснить мне метод .getClass() в java

Когда я использую метод .getClass(), я могу сравнить два класса с методом .equals() и методом ==/!=. Так как я могу использовать знаки ==/!=, я бы предположил, что метод .getClass(), который возвращает класс объекта, должен возвращать примитивный тип. Но поиск в google единственное, что я узнал об этом методе в API Java, это то, что он возвращает класс объекта. Он не сообщает мне тип переменной, который он возвращает. Как именно этот метод работает. Что он возвращает? Я попытался спросить своего учителя, но она не знала. Спасибо!

ответ

0

getClass() возвращает экземпляр (объект) класса Class. Поскольку каждый класс Java имеет один экземпляр класса Class, если два объекта принадлежат одному классу, то для этих двух объектов getClass() вернет тот же isntance, и поэтому вы можете использовать == для их сравнения, поскольку == при применении к ссылочным типам определяет если две ссылки относятся к одному экземпляру.

+0

Не забывайте о 'ClassLoader', см. Ответ hotzst. – vektor

+0

Я хотел бы поблагодарить вас за ваш ответ. Если я правильно понимаю, каждый класс создает уникальный экземпляр (объект) класса Class. Затем, когда вы используете метод getClass(), он возвращает ссылку на этот экземпляр класса. Таким образом, когда вы используете! = И ==, вы сравниваете два разных класса, чтобы увидеть, указывают ли они на одну и ту же ссылку в памяти. Это правильно? – John

2

Компараторы == и != сравнивают равенство в образе идентичности. Итак, как это работает для примитивов, очевидно. Однако он также может использоваться для сравнения объектов. Однако чаще всего это работает не так, как ожидалось. Существуют некоторые исключения:

String s хранятся как литералы, поэтому, если вы определяете два экземпляра String, содержащих одинаковое значение, они используют один и тот же литерал. Подумайте об этом, как в обоих случаях, указывая на то же место памяти.

Enum s - это в основном набор констант, поэтому значение перечисления является либо одним и тем же экземпляром, либо нет. Не может быть, что перечисление имеет одно и то же значение, но является другим экземпляром.

То же самое верно для Class объектов, что вы получаете при звонке getClass(). Объект Class создается при ClassLoader при загрузке файла * .class. При последующих вызовах используется тот же объект Class. Поэтому Class объектов можно сравнить с == и !=. Однако будьте осторожны, если A.class загружается двумя разными ClassLoader s, объекты класса, которые вы получаете от них, не имеют одного экземпляра.

+3

_ «Строки хранятся как литералы, поэтому, если вы определяете два экземпляра String, содержащих одно и то же значение, они используют один и тот же литерал.» _ Это неправильно, это относится только к тем же строковым литералам или интернированным строкам, а не к ** все ** строки с одинаковым значением, например: 'new String (" X ")! =" X "' –

-2

Полиморфизм является одной из наиболее важных функций для 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(){ 
     } 
} 
0

Сначала необходимо знать, как == и != сравнить два операнда. Причина, почему == и != не может использоваться для сравнения ссылочных типов, заключается в том, что они фактически сравнивают адреса памяти двух переменных ссылочного типа.

Так что, если у меня есть две строки:

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

Так как x и y одни и те же адреса памяти после того, как вторая линия выполнена, x == y имеет значение верно.

То же самое касается метода getClass(). Метод getClass() возвращает класс объекта как объект Class<T>. Вопрос в том, почему это так:

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

Ответ прост. Потому что x и y оба типа String. Поэтому вызов getClass вернет тот же экземпляр. Это означает, что два возвращенных объекта имеют один и тот же адрес памяти.

«Но когда я сравниваю строки с одинаковыми символами с оператором ==, он вычисляет значение false!» вы закричали.

Это потому, что строки расположены по разным адресам памяти. Но классы, возвращаемые getClass, всегда имеют одинаковый адрес памяти, если класс, который они представляют, тот же. Это связано с тем, как работает ClassLoader. Но я не эксперт.

Вам просто нужно знать, что объекты, возвращаемые getClass, имеют одинаковый адрес памяти, если классы, которые они представляют, одинаковы.

0

Метод .getClass просто вернет класс объекта. Когда вы объявляете новый экземпляр объекта, он будет ссылаться на класс. Для каждого jvm может быть только один класс, но несколько объектов, ссылающихся на него. Поэтому, когда вы получаете класс из двух объектов, они могут ссылаться на один и тот же класс!

Смежные вопросы