1 Object类的简介
1)在Java类继承结构中,java.lang.Object类位于顶端;
2)如果定义一个Java类时没有使用extents关键字声明其父类,则其父类默认为java.lang.Object类;
3)Object类型的引用变量可以指向任何类型对象。
2 重写Object类的toString方法
方法简介:
Object类中的重要方法,用于返回对象值的字符串表示;
toString方法不重写时的状况:
1)Java语言中很多地方会默认调用对象的toString方法:
例如:System.out.println(任意对象),直接调用toString方法
2)如果不重写toString方法,将使用Object的toString方法,其调用后的返回值为:
类名@散列码
toString方法重写的原因:
1)toString方法是非常有用的调试工具;
2)JDK中的标准类库中,许多类都定义了toString方法,方便用户获得有关对象状态的必要信息;
3)强烈建议为自定义的每个类都增加toString方法。
4)原则上建议重写,重写的格式大多数遵循”类的名字[域值]”。
Demo:
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
//重写toString方法,格式:类名+N个属性值
public String toString(){
return "className="+this.getClass().getName()+";
name="+this.name+";
age="+this.age;
}
public static void main(String[] args) {
Person p = new Person("hong",21);
System.out .println(p.toString());
}
}
输出值是:
className=com.example.objects.Person; name=hong; age=21
如果不重写toString方法:输出值是:
com.example.objects.Person@7852e922
3 重写Object类的equals方法
简介:
这个方法判断两个对象是否具有相同的引用,即是否为相同的对象;
重写equals方法的意义:
重写该方法,通过比较对象的成员属性,使该方法更有意义。
实例:
package com.example.objects;
public class Person {
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
//重写toString方法,格式:类名+N个属性值
public String toString(){
return"className="+this.getClass().getName()+"; name="+this.name+"; age="+this.age;
}
//重写equals方法,关键看斜边的第三个if
public boolean equals(Object obj){
if(obj==null){
return false;
}
if(this==obj){
return true;
}
if(obj instanceof Person){
Person person=(Person)obj;
return person.name==this.name&&person.age==this.age;
}else{
return false;
}
}
public static void main(String[] args) {
Person p = new Person("hong",21);
Person p2 = new Person("hong",21);
System.out .println(p.equals(p2));
}
}
输出值是:
true
4 equals和==
(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
1)“==”比较两个变量本身的值,即两个对象在内存中的首地址。
2)“equals()”比较字符串中所包含的内容是否相同。
代码实例:
(2)对于非字符串对象来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
class A
{
A obj1 = new A();
A obj2 = new A();
}
那么:obj1==obj2是false
obj1.equals(obj2)也是false
(3)对于非字符串对象来说,如果重新定义了equals这个方法,而且比较的是值,而不是地址。"=="和"equals"方法的作用则不同了。见下边的例子:
package com.example.objects;
public class Animal {
private String name;
private int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
}
public boolean equals(Object obj){
if(obj instanceof Animal){
Animal animal=(Animal)obj;
return animal.name==this.name&&animal.age==this.age;
}else{
return false;
}
}
public static void main(String[] args) {
Animal a = new Animal("xing",5);
Animal a2 = new Animal("xing",5);
System.out.println(a.equals(a2));//true,重写了equals方法
System.out .println(a==a2);//false,==比较的是地址值,而不是像equals方法,因此是false
}
}
(4)如果是基本类型比较,那么只能用==来比较,不能用equals ,见下边的例子
int a = 3;
int b = 4;
int c = 3;
System.out.println(a == b);//结果是false
System.out.println(a == c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过
网友评论