1、即使是没有写继承,其实也是继承于Object类,是Object类的子类
2、toString方法
(1)返回类型是String类型的
public String toString()
(2)一个引用,经常需要访问一个字符串或者需要当做字符串来处理的时候,这个时候,需要调用这个引用所指对象的toString方法,也就是说,把引用当字符串处理的时候,都会调用toString方法。
(3)如果+一边是字符串,一边是引用的时候,这个时候,需要将引用当成字符串来处理,java中一般都是调用这个引用所指对象的toString方法
(4)因为没有重写toString方法,所以调用的是Rectangle类从Object类中继承来的方法,或者是实现的是Object类中toString类的默认输出,包名.类型@逻辑地址
(5)但是有时候想要输出的是比如长、宽等,所以这个时候,需要对toString进行重写
注意:在System.out.println()中,如果括号中的形参仅仅是一个引用,没有+的时候,实际上打印的是形参也就是引用的toString
注意:
JAVA非main函数里不能System.out.println();
这样是错误的。
这样是正确的。
3、equals方法
(1)a.(equals)b :比较的是内容是否相同
public boolean equals(Object o)
形参必须是Object
(2)== :a==b是判断a和b的地址是否相同,或者是说a和b是否指向同一个对象,即使有时内容相同,但是指向的逻辑地址不一定相同
(3)equals方法在Object中有默认实现的,但是满足不了子类的要求,因为默认实现与==类似,满足不了看内容是否相等的要求。
(4)因为没有重写,所以是默认方法,也就是看逻辑地址是否相同(是否指向同一个对象)
因为指向的是两个对象,所以返回的是false;
(5)重写equals方法
因为判断内容是否相同有多种,比如面积相同则相同、长相同则相同等,现在这里假设是长和宽同时相同的时候才为相同,则如下所示
但是,上面的写法是有问题的,因为如果没有Rectangle rec2=new Rectangle(3,4);
这句话,而是Cat c=new Cat();
那么在Sysem.out.println(rec1.equals(c));
这个时候会出错,编译没有问题,因为o是Object类型的,所以可以传过Cat类型的,强制类型转换可能也是可以的,但是调用属性的时候会报错,因为c所指的对象中没有a和b,所以,猫无法和矩形进行比较,因此运行的时候会报错。
改进方法:
public boolean equals(Object o)
{
if(o==null) return false;
else
{
boolean result=false;
if(o instanceof Rectangle)
{
Rectangle rec1=(Rectangle)o;
if(this.a==rec1.a&&this.b==rec1.b)
{
result=true;
}
}
return result;
}
}
(6)自动生成equals
右击——源码——生成hashCode()和Equals()
这个是可以直接使用的。
(7)
注意:1、stu1.equals()调用的是stu1中重写的equals方法
pg1.equals()调用的是pg1中的equals方法
2、equals中的形参是Object类