1.Object 类常用 6 个方法
a.public int hashCode()
哈希编码: 和内存地址有关, 根据内存地址通过哈希算法计算出的一个哈希值. 作用是通过比较哈希值得到两个对象是否相等, 但是哈希值相等不一定两个对象就相同, 比如两个字符串 "Aa" 和 "BB"
两个字符串, hash 编码不同, 内容一定不同
两个字符串, hash 编码相同, 内容不一定相同
b. public final Class getClass()
用来获取全限命名
Class 和反射有关, 代表类的字节码对象.
c. public String toString()
重写该方法自定义对象的输出格式
d. public boolean equals(Object obj)
equals 方法本质上和 == 是没有区别的, 因为该方法来自于 Object 类, 而其底层实现是通过 == 来做判断处理的;
但是对于重写过后的 equals 方法来说, 它们就有区别了.
区别在于: 重写后的 equals 方法用来判断两个对象的内容是否相同, 比较的是堆内存中的对象;
== 是用来判断对象的引用是否相等, 比较的是栈内存中的引用地址;
e. protected void finalize()
该方法的作用是作为一种临终遗言, 在程序结束前会调用这个方法, 所以可以用来记录垃圾清理结束时间
该方法: 不建议程序员手动调用, 垃圾回收会自动调用
如果想手动调用垃圾回收可以调用 System.gc();
重点: final finally finalize 的区别
a.final 修饰符 (关键字). 被 final 修饰的类, 就意味着不能再派生出新的子类, 不能作为父类而被子类继承. 因此一个类不能既被 abstract 声明, 又被 final 声明. 将变量或方法声明为 final, 可以保证他们在使用的过程中不被修改. 被声明为 final 的变量必须在声明时给出变量的初始值, 而在以后的引用中只能读取. 被 final 声明的方法也同样只能使用, 即不能方法重写.
b.finally 是在异常处理时提供 finally 块来执行任何清除操作. 不管有没有异常被抛出, 捕获, finally 块都会被执行. try 块中的内容是在无异常时执行到结束. catch 块中的内容, 是在 try 块内容发生 catch 所声明的异常时, 跳转到 catch 块中执行. finally 块则是无论异常是否发生, 都会执行 finally 块的内容, 所以在代码逻辑中有需要无论发生什么都必须执行的代码, 就可以放在 finally 块中.
c.finalize 是方法名. java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作. 这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的. 它是在 object 类中定义的, 因此所有的类都继承了它. 子类覆盖 finalize() 方法以整理系统资源或者被执行其他清理工作. finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的.
f. protected Object clone()
必须实现 Cloneable 接口, 子类重写方法
分为浅克隆和深克隆 (深克隆如果属性是另一种类的对象, 那么这个属性所在的类也要实现接口并重写)
深克隆举例:
- public class Student implements Cloneable {
- private String name;
- private Book book;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Book getBook() {
- return book;
- }
- public void setBook(Book book) {
- this.book = book;
- }
- // 关于重写克隆方法, 在浅克隆时可以快捷键默认, 不用重写内容, 返回的是 super.clone(); 对于返回的是父类的克隆方法的理解:
- // 可以了解一下 Java 的 RTTI 机制, super.clone() 中的 super 是基类, 但是并不是本质的 Object 类,
- // 而是 JVM 根据实际调用 clone 的类进行派生出来的 Object 对象, 你可以近似理解每个类的派生基类就是本身
- @Override
- public Object clone() throws CloneNotSupportedException {
- Student o = (Student)super.clone();
- Book b = (Book) o.getBook().clone();
- o.setBook(b);
- return o ;
- }
- }
- public class Book implements Cloneable{
- private String bookName;
- public String getBookName() {
- return bookName;
- }
- public void setBookName(String bookName) {
- this.bookName = bookName;
- }
- @Override
- protected Object clone() throws CloneNotSupportedException {
- // TODO Auto-generated method stub
- return super.clone();
- }
- }
- public class Test {
- public static void main(String[] args) throws Exception {
- Student st = new Student();
- Book book = new Book();
- book.setBookName("西游记");
- st.setBook(book );
- st.setName("张三");
- Student clone = (Student) st.clone();
- System.out.println(st == clone);
- System.out.println(st.getName()+st.getBook().getBookName());
- System.out.println(clone.getName()+clone.getBook().getBookName());
- st.setName("花花");
- book.setBookName("红楼梦");//
- System.out.println(st.getName()+st.getBook().getBookName());
- System.out.println(clone.getName()+clone.getBook().getBookName());
- }
- }
执行结果
false
张三西游记
张三西游记
花花红楼梦
张三西游记
来源: https://www.cnblogs.com/19322li/p/10652540.html