我目前正在大学学习java课程。这是我的第一个编程课程,我偶然发现了一些我无法理解的内容。据我所知,有两种比较变量的方法。第一个是使用==
,!=
,<
,>
,=<
,>=
符号表示PRIMITIVE变量,例如int,double,等等第二种方法是使用.equals()方法作为引用类型。现在这是我的问题:
当我使用.getClass()
方法时,我可以使用.equals()方法和==
/ !=
方法比较两个类。由于我可以使用==
/ !=
符号,因此我认为返回对象类的.getClass()
方法必须返回基本类型。但是在google上搜索我在java API中发现这个方法的唯一方法就是它返回一个对象的类。它没有告诉我它返回的变量类型。这种方法究竟是如何工作的。它返回了什么?我试着问老师,但她不知道。谢谢!
答案 0 :(得分:3)
比较器==
和!=
比较了身份的平等。那么这对于原语是如何工作的是显而易见的。但是它也可以用于比较对象。然而,大多数情况下,这不会按预期工作。有一些例外:
String
存储为文字,因此如果您定义两个包含相同值的String
实例,则它们使用相同的文字。可以想象这两个实例都指向相同的内存位置。
Enum
s基本上是常量的集合,因此枚举值可以是同一个实例,也可以不是。它不能是枚举具有相同的值,而是另一个实例。
Class
个对象也是如此,这是调用getClass()
时得到的。 Class
对象是第一次加载* .class文件时由ClassLoader
创建的。在后续调用中,使用相同的Class
对象。因此,可以将Class
个对象与==
和!=
进行比较。但请注意,如果A.class
由两个不同的ClassLoader
加载,则从它们返回的类对象不属于同一个实例。
答案 1 :(得分:3)
首先,您需要了解==
和!=
如何比较两个操作数。 ==
和!=
无法用于比较引用类型的原因是它们实际上比较了两个引用类型变量的内存地址。
所以,如果我有两个字符串:
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返回的对象在它们所代表的类相同的情况下位于相同的内存地址。
答案 2 :(得分:0)
getClass()
返回Class
类的实例(对象)。由于每个Java类都有一个Class
类的实例,如果两个对象属于同一个类,那么这两个对象的getClass()
将返回相同的isntance,因此您可以使用==
为了比较它们,因为==
应用于引用类型时确定两个引用是否引用同一个实例。
答案 3 :(得分:0)
.getClass方法只返回对象的类。声明对象的新实例时,它将引用一个类。每个jvm只能有一个类,但是多个对象引用它。所以当你得到两个对象的类时,它们可能指的是同一个类!
答案 4 :(得分:-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(){
}
}