繁体   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