Java知识点:Object类
2013-07-19 14:03
232 查看
toString()方法
原始实现:public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); //类名+@+对象的hash值的十六进制 }
hashCode()和equals()方法
方法:public boolean equals(Object obj);
public int hashCode();
默认规则:
如果两个引用变量引用的是不同对象,则hash值不同,equals返回false。
如果两个引用变量引用的是同一个对象,则hash值相同,equals返回true。
建议:
要么同时实现equals和hashCode方法,要么都不要实现。
在eclipse中可以自动实现,【source】->【generate hashcode() and equals()】。
如果一个类不实现equals和hashCode方法,会有坏处:
对于类似 HashSet 的hash数据结构(比如HashSet<Person> set = new HashSet<Person>(),其中 Person 是自己实现的类),在HashSet中加入new Person("A")、new Person("B")。
如果想要查找是否存在一个名叫"A"的人,则需要:
set.contains(new Person("A")); //返回false
我们希望他返回true,因为确实存在一个名叫A的人,但是实际返回的是 false。因为contains(Person p) 的运行规则是:
执行 p.hashCode()找到正确的桶。
对于那个桶中的每个元素b,执行p.equals(b),如果有一个返回true,则contains方法返回true,否则返回false。
因为查找的对象和在HashSet中的对象的hash值不同,因此根本找不到对应的桶。
clone()方法和Cloneable接口
方法:protected native Object clone() throws CloneNotSupportedException;
从上面的方法中可以看出:
该方法并没有方法体,而是声明为native,表示这是本地方法。
protected: 这个方法只有在同一个包或者子类中才能够调用。
函数返回的是Object,因此每次调用clone后需要强制类型转换。
因此下面的代码并不能编译通过:
String s1 = "hello"; String s2 = (String)s1.clone(); // Compile Error
不能编译通过的原因:
String类定义在java.lang包中。
String类没有实现cloneable接口。
此代码所在包和String类在不同的包中。
注意点:
虽然Cloneable接口只是一个标识接口,但是只有实现了Cloneable接口,才表示这个类是可复制的。
如果定义了一个类A,此类没有重写clone方法,则 类A的对象a调用clone方法时,编译错误。
如果定义了一个类A,此类直接重写clone方法, 而不实现Cloneable接口,则类A的对象a调用clone方法时,会抛出:CloneNotSupportedException。
默认clone方法实现的是浅层复制,而不是深层复制。
在重写clone方法时,建议先执行super.clone()方法。
深层复制和浅层复制
浅层复制: 被复制的对象的所有成员属性都有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅层复制仅仅复制所考虑的对象,而不复制它所引用的对象。文字的表述不是很清晰,下面用图示来解释:
public class Object05 { public static void main(String[] args) throws Exception{ A a1 = new A(10); B b1 = new B(a1); B b2 = (B)b1.clone(); b1.a.age = 20; System.out.println(b2.a.age); //输出:10,改变b1并不会改变b2 A a2 = new A(10); C c1 = new C(a2); C c2 = (C)c1.clone(); c1.a.age = 30; System.out.println(c2.a.age); //输出30,改变c1会改变c2 } } class B implements Cloneable { A a; public B(A a) { this.a = a; } public Object clone()throws CloneNotSupportedException //深层复制 { B b = (B)super.clone(); b.a = (A)this.a.clone(); return b; } } class C implements Cloneable { A a; public C(A a) { this.a = a; } public Object clone()throws CloneNotSupportedException //浅层复制 { return super.clone(); } } class A implements Cloneable { int age; public A(int age) { this.age = age; } public Object clone()throws CloneNotSupportedException { return super.clone(); } }
View Code
finalize()方法
此方法是由垃圾回收器调用的,当垃圾回收器决定回收对象a时,则会调用a的finalize方法。getClass()方法
此方法主要用于反射,下面的例子简单的介绍了这个方法的应用:import java.lang.reflect.Field; public class Object06 { public static void main(String[] args) { Class c = new Person().getClass(); System.out.println("类名:"+c.getName()); Field[] fs = c.getDeclaredFields(); System.out.print("字段名:"); for(Field f:fs) { System.out.print(f.getName()+","); } } } class Person { private String name; private int age; }
相关文章推荐
- java小知识点-instanceof和object类
- JAVA面向对象知识点总结(7)— 多态性、Object类
- Java知识点:Object类
- Java知识点整理:第七章:static关键字、final关键字、抽象类 、接口、Object类
- Core Java第十章知识点总结——Object类 包装类 内部类
- Core Java第十章知识点总结——Object类 包装类 内部类
- Java知识点:Object类
- JVM知识点总览-高级Java工程师面试必备
- 重拾Java——一些小的知识点(1)
- Java内存分配管理知识点
- 机器学习知识点(六)增广矩阵求解拉格朗日乘子法的Java实现
- Java多线程知识点整理(Lock锁)
- [置顶] 基础知识整理之Java基础知识点梳理(详细)
- JVM(8):JVM知识点总览-高级Java工程师面试必备
- 《从零开始写Javaweb框架》知识点--依赖注入的实现
- java学习日记(10)———java重要知识点反射的学习
- java琐碎的知识点
- java web 100个知识点
- java 枚举类型知识点记录
- JAVA 每日知识点 之 Java 内存区域 (20160826)