zoukankan      html  css  js  c++  java
  • Object类中方法详解

    概述

    Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。所有的类都直接或者间接的继承自Object类。该类的设计也符合面向对象中"万事万物皆对象"的思想。

    构造方法

    public Object()

    • 任何一个类都会调用这个方法,访问子类构造方法的首先会先访问父类无参的构造方法。

    hashCode方法

    int hashCode()

    • 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。

    • (这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

    • hashCode和地址有关,我们可以理解为地址值,但是不是真实地址值

    public class ObjectDemo02 {
           public static void main(String[] args) {
                   Student s1 = new Student("老王", 37);
                   Student s2 = new Student("老王", 37);  
                   System.out.println(s1.hashCode());
                   System.out.println(s2.hashCode());
                   Student s3 = s1;
                   System.out.println(s1 == s2); // false
                   System.out.println(s1 == s3); // true
                   
           }
    }
    

    getClass方法

    我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的class对象。这个对象指的是代表一个类型的对象,因为一切皆是对象,类型也不例外,在Java使用class类的对象来表示一个类型。所有的类型类都是Class类的实例。

    A a = new A();
    
    if(a.getClass()==A.class)
    System.out.println("equal");
    else System.out.println("unequal");
    
    //结果为equal;
    

    因此,获取类的class对象的两种方式:

    1. 如果你知道一个实例,那么你可以通过实例的“getClass()”方法获得该对象的class对象
    2. 如果你知道一个类型(String名称),那么你可以使用“类名.class”的方法获得该类型的class对象

    toString方法

    String toString()
    返回类名和hashCode值

    源码:

    public String toString() {
           return getClass().getName() + "@" + Integer.toHexString(hashCode());
       }
    
    • toString返回的是一个 类名全路径 + @ + hashCode的十六进制
      System.out.println(s1);
    • 输出语句输出一个引用类型的时候,默认调用了引用类型的toString方法输出

    equals方法

    boolean equals(Object obj)
    判断两个类的地址是否相等;

    源码:

    public boolean equals(Object obj) {
            //      s1 == s2
           return (this == obj);
       }
    

    通过源码我们发现 Object方法中的equals比较的是地址值。
    然而比较两个对象是否相等,比较地址值毫无意义。我们希望比较两个对象,比较的是成员变量是否相等,所以说父类Object继承过来的equals方法不能满足具体子类Student的需求,所以需要方法重写。

    String类中equals方法:
    源码:

    	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;
        }
    

    所以比较两个字符串是否相等比较的是每一个字符是否相等。
    因为字符串类重写equals方法。
    如果我们自己写的类不重写equals方法,那么比较的是地址值是否相等。

    在开发中一般用自动生成
    alt+shift+s 再按H
    通过观察自动生成的代码我们发现字符串比较的是内容是否相等

    clone方法

    protected Object clone()
    创建并返回此对象的一个副本

    使用时注意异常:java.lang.CloneNotSupportedException
    异常:克隆不支持异常
    原因:需要克隆的类没有实现克隆接口。
    解决:找到要克隆的类实现Cloneable接口。

    public class Test {
    	public static void main(String[] args) throws CloneNotSupportedException {
    		TestClone t = new TestClone("张三",29);
    		TestClone l = new TestClone("李四",33);
    		Object tClone = t.clone();
    		TestClone tc = (TestClone)tClone;
    		System.out.format("%-4s"+"%d",tc.name,tc.age);
    	}
    }
    class TestClone extends Object implements Cloneable{
    	String name;
    	int age;
    	public Object clone() throws CloneNotSupportedException{
    		return super.clone();
    	}
    	public TestClone(){}
    	public TestClone(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    }
    		//输出:张三	29
    
    

    finalize方法

    protected void finalize()

    • 当垃圾回收器确定不存在对该对象的更多引用时。
    • 由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定。

    一般有两中情况对象会被作为垃圾对象:

    1. 当对象被赋null
    Student s = new Student();
            s = null;
    
    1. 当对象重新被创建
    Student s = new Student();        
            s = new Student();
    

    注意点:
    finalize()方法,finally关键字,final关键字的区别?

    • finalize()方法

    当垃圾回收器确定不存在对该对象的更多引用时, 由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定。

    • final

    final修饰的变量表示常量,不能够被二次赋值 。
    final修饰的类不能够被继承 。
    final修饰的方法不能够被子类重写。

    • finally

    Java 中的 Finally 关键一般与try一起使用,在程序进入try块之后,无论程序是因为异常而中止或其它方式返回终止的,finally块的内容一定会被执行 。
    特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))。
    作用:用于释放资源,在IO流操作和数据库操作中常见到。

    以上

  • 相关阅读:
    HOWTO re
    数据类型
    字符串
    最大公约数
    this
    tip 2:找最小公倍数之Boost
    tip 1:一个简单的将int型转换成char的方法
    Item47
    成员函数模板
    item44:将与参数无关的代码抽离template
  • 原文地址:https://www.cnblogs.com/fzxey/p/10759234.html
Copyright © 2011-2022 走看看