您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
javase第二季学习笔记-Object类
发布时间:2017-07-10 14:31:58编辑:雪饮阅读()
Object类是类层次结构的根类
每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的方法。
如果某个类没有显式继承任何类则它默认继承Object类
所有类都是Object类的子类
toString()方法:
public String toString()
返回该对象的字符串表示
通常,toString方法会返回一个“以文本方式表示”此对象的字符串。
应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object类的toString方法返回一个字符串,该字符串由类名(对象是该类的一个实例)
、at标记符”@”和对象哈希的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName()+’@’+Integer.toHexString(hashCode())
示例值如: Baboon@c17164
这是一个对象的引用内存地址,这是默认没有重写toString方法的情况下的返回值
示例代码:
public class NewKeywordDemo
{
public static void main(String[] args){
Baboon bb=new Baboon("小白",7,'公');
System.out.println(bb);
}
}
//狒狒类
class Baboon
{
private String name;
private int age;
private char sex;
public Baboon(String name,int age,char sex){
this.name=name;
this.age=age;
this.sex=sex;
}
}
equals方法
public boolean equals(Object obj)
指示其它某个对象是否与此对象相等(值相等,而非引用地址相等,”==”只是比对两个对象的引用地址是否相等,那么如果有new了两个相同的对象通过”==”对比则是false,所以对象的是否相同在比较时要酌情考虑)。equals方法在非空对象引用上实现相等关系:
自反性
对称性
传递性
一致性
自反性:对于任何非空引用值,x, x.equals(x)都应返回true
对称性:对于任何非空引用值,x和y,当且仅当y.equals(x)返回true,x.equals(y)才返回true.
传递性:对于任何非空引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也应返回true。
一致性:对于任何非空引用值x和y,多次调用x.equals(y)始终返回true或者false。前提是对象上equals比较所用的信息没有被修改。
对于任何非空引用值x, x.equals(null)都应返回false。
如果要重写equals方法,则需要遵循这四个原则
示例代码:
public class NewKeywordDemo
{
public static void main(String[] args){
Baboon bb=new Baboon("小白",7,'公');
Baboon cc=new Baboon("小白",7,'公');
//如果没有重写的情况
System.out.println(bb);
//通过引用地址来比较对象是否相同
System.out.println(bb==cc);
//通过值来比较对象是否相同
System.out.println(bb.equals(cc));
}
}
//狒狒类
class Baboon
{
private String name;
private int age;
private char sex;
public Baboon(String name,int age,char sex){
this.name=name;
this.age=age;
this.sex=sex;
}
//重写Object类中的toString方法
public String toString(){
return "name="+name+",age="+age+",sex="+sex;
}
}
==是基本运算符中的一个,它的作用:用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
而equals()作为方法,我们可以推测知道,它其中的实现所使用的肯定是==运算符。再进一步的思考,equals()本意不正是==运算符进行对象比较时候的作用吗。那么,既然是两者有同样的作用,为什么还要弄出一个equals()方法来呢。因为==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。在上面的第三个例子中,我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过==运算符是做不到的。
而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)
示例代码:
public class NewKeywordDemo
{
public static void main(String[] args){
Baboon bb=new Baboon("小白",7,'公');
Baboon cc=new Baboon("小白",7,'公');
//如果没有重写的情况
System.out.println(bb);
//通过引用地址来比较对象是否相同
System.out.println(bb==cc);
//通过值来比较对象是否相同
System.out.println(bb.equals(cc));
method(cc);
method("杜敏捷");
}
public static void method(Object obj){
//Object可以接收任何类,因为它是祖宗类
if(obj instanceof Baboon){
//如果属于Baboon类,则强制转换为Baboon,则可以调用Baboon的eat方法。
//当然不强制转换也可以,但若是父类引用子类对象时(此时该对象既属于父类又属于子类)
//但默认找方法是在父类找,找不到就报错。即便该对象所属子类有该方法
//所以需要强制转换
Baboon b=(Baboon) obj;
b.eat();
}
else{
System.out.println("该对象不是Baboon的实例");
}
}
}
//狒狒类
class Baboon
{
private String name;
private int age;
private char sex;
public Baboon(String name,int age,char sex){
this.name=name;
this.age=age;
this.sex=sex;
}
public void eat(){
System.out.println("猴子吃香蕉");
}
//重写Object类中的toString方法
public String toString(){
return "name="+name+",age="+age+",sex="+sex;
}
//重写equals方法
public boolean equals(Object obj){
//如果内存地址相等,那么一定是同一个对象,就无需比较两个对象的属性值
if(this==obj){return true;}
if(obj instanceof Baboon){
Baboon b=(Baboon) obj;//强制转换
//String类的equals已经重写过了的
if(!this.name.equals(b.name)){return false;}
if(this.age!=b.age){return false;}
if(this.sex!=b.sex){return false;}
//如果以上语句都没有执行,则表示该对象和当前对象是相等的。
return true;
}
else{return false;}
}
}
关键字词:javase,Object类