这个类很有意思,是所有类的爹,这个类中定义的东西是所有类中具备的。
给大家上代码,来理解这个。
package duotai;
class d{
}
public class object_d {
public static void main(String[] args) {
d d1=new d();
d d2=new d();
System.out.print(d1.equals(d2));
}
}
输出:false//d1和d2因为内存不一样所以是false。
大家可以看到,d类中什么也没有,但是可以用equals方法,那么这个方法哪来的呢,就是继承的他的父亲,Object这个类的。
如果类的对象不一样的话,可以用equals比较吗?
package duotai;
class d{
}
class c{
}
public class object_d {
public static void main(String[] args) {
d d1=new d();
c c1=new c();
System.out.print(d1.equals(c1));
}
}
输出:false
因为equals是c和d类的爹Object的方法所以,Object可以随便比较儿子啊。
如果自定义类中有和父类相同的功能咱们没必要自己定义,继承父类的功能即可,建立自己特有的内容就好,这就是覆盖。
气死我了,上代码(Object类中自带equals方法):
package duotai;
class d{
private int num;
d(int num){
this.num=num;
}
public boolean equals(Object obj) {
d d1=(d)obj;//如果没有下转,就会报错,Object里并没有定义num变量。
return this.num==d1.num;
}
}
public class object {
public static void main(String[] args) {
d d2=new d(2);
d d3=new d(2);
System.out.print(d2.equals(d3));
}
}
输出是:true
那么都是继承的父类equals可以跨类比较吗?
package duotai;
class d{
private int num;
d(int num){
this.num=num;
}
public boolean equals(Object obj) {
d d1=(d)obj;//如果没有下转,就会报错,Object里并没有定义num变量。
return this.num==d1.num;
}
}
class e{
private int num;
e(int num){
this.num=num;
}
}
public class object {
public static void main(String[] args) {
d d2=new d(2);
e e2=new e(2);
System.out.print(d2.equals(e2));
}
}
这样是不行的,因为equals重写的里面,咱们是把Object转成了d类,那么问题来了,e类能转成d类吗?答案是不行,因为儿子凭什么转儿子,大家都一样都是儿子。
一天一个学废小技巧:
咱们看看Object的一些函数
首先咱们直接试试类的实体用toString()函数和hashCode()的效果
package duotai;
class d{
private int num;
d(int num){
this.num=num;
}
}
class e{
private int num;
e(int num){
this.num=num;
}
}
public class object_b {
public static void main(String[] args) {
d d2=new d(2);
System.out.println(Integer.toHexString(d2.hashCode()));
System.out.print(d2.toString());
}
}
输出是:52cc8049
duotai.d@52cc8049这
是类的哈希值,这是内存的经典数据结构啦。
是不是所有的对象都具备哈希值?答案是肯定的
咱们再继续看getClass功能
package duotai;
class d{
private int num;
d(int num){
this.num=num;
}
public void a() {
System.out.print("lala");
}
}
public class object {
public static void main(String[] args) {
d d2=new d(2);
Class c=d2.getClass();//类文件对象
System.out.println(c.getName());
}
}
得到的是:duotai.d,d2对应的类名,当然Class类中有很多种方法。
不知道大家发现了没有,Object类的toString()作用就是c.getName()+Integer.toHexString(d2.hashCode())的结果。
每日一练:
自己写一个类重写Object父类的toString()方法,改成输出你的名字+类的名字。