类与对象
三大特征
面向对象四大特征: 封装、继承、多态.
Object类和包装类
equals
1 2 3 4 5 6 7
| Student st1 = new Student("小明",12); Student st2 = new Student("小明",12); System.out.println(st1.equals(st2)); -------------------------------------- String s1 = new String("哈啊哈哈"); String s1 = new String("哈啊哈哈"); System.out.println(s1.equals(s2));
|
大家都知道引用数据类型变量保存的是地址值,equals()方法比较是对象的内容,上述两组代码比较的内容一样,为啥结果却不一样,不要着急,我们首先看看Object类中的equals方法的源码
1 2 3
| public boolean equals(Object obj) { return (this == obj); }
|
观看源码才发现,Object类中的equals方法实际上比较的是地址值,Object类是根父类,而Student类并没有重写equals方法.所以st1 不等于st2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
|
由于String类对Object类的equals方法进行重写,确立比较每一个字符相等.所以s1 == s2.
自定义类重写equals方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public boolean equals(Object obj){ if(this == obj){ return true; } if(obj instanceof Student){ Student cust = (Student) obj; if(this.age == cust.age && this.name.equals(cust.name)){ return true; }else{ return false; } } return false; }
|
接口与抽象