[英]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;
由于x
和y
在执行第二行后共享相同的内存地址,因此x == y
计算结果为true。
getClass()
方法也是如此。 getClass()
方法将对象的Class<T>
作为Class<T>
对象返回。 问题是,为什么评估为真:
x.getClass() == y.getClass()
答案很简单。 因为x
和y
都是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.