`
hemingwey
  • 浏览: 7167 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

java的Object类

阅读更多

一、概述:
       Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。
      可以使用类型为Object的变量指向任意类型的对象。
      Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法。
      Object类的变量只能用作各种值的通用持有者。要对他们进行任何专门的操作,都需要知道它们的原始类型并进行类型转换。例如:
      Object obj = new MyObject();
      MyObject x = (MyObject)obj;

 

二、方法使用说明
1、equals()方法:用于测试某个对象是否同另一个对象相等。它在Object类中的实现是判断两个对象是否指向同一块内存区域。这中测试用处不大,因为即使内容相同的对象,内存区域也是不同的。如果想测试对象是否相等,就需要覆盖此方法,进行更有意义的比较。例如
class Employee{
... //此例子来自《java核心技术》卷一
    public boolean equals(Object otherObj){
        //快速测试是否是同一个对象
        if(this == otherObj) return true;
        //如果显式参数为null,必须返回false
        if(otherObj == null) reutrn false;
        //如果类不匹配,就不可能相等
        if(getClass() != otherObj.getClass()) return false;
       
        //现在已经知道otherObj是个非空的Employee对象
        Employee other = (Employee)otherObj;
        //测试所有的字段是否相等
        return name.equals(other.name)
            && salary == other.salary
            && hireDay.equals(other.hireDay);
    }
}
Java语言规范要求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。
从这里看出,上面的例子是Java规范的equals方法的标准实现,推荐用上面例子的写法实现类的equals方法。
 
2、toString():返回该对象的字符串表示。Object类中的toString()方法会打印出类名和对象的内存位置。几乎每个类都会覆盖该方法,以便打印对该对象当前状态的表示。大多数(非全部)toString()方法都遵循如下格式:类名[字段名=值,字段名=值...],当然,子类应该定义自己的toString()方法。例如:
public String toString(){
    reurn "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";
}
toString()方法是非常重要的调试工具,很多标准类库中的类都定义了toString()方法,以便程序员获得有用的调试信息。
 

 

另外:
以下介绍的三种属于Object的方法:
(1)finalize方法:当一个对象被垃圾回收的时候调用的方法。
(2)toString():是利用字符串来表示对象。
当我们直接打印定义的对象的时候,隐含的是打印toString()的返回值。
可以通过子类作为一个toString()来覆盖父类的toString()。
以取得我们想得到的表现形式,即当我们想利用一个自定义的方式描述对象的时候,我们应该覆盖toString()。

(3)equal
首先试比较下例:
String A=new String(“hello”);
String B=new String(“hello”);
A==B(此时程序返回为FALSE)
因为此时AB中存的是不同的对象引用。 
附加知识:
字符串类为JAVA中的特殊类,String中为final类,一个字符串的值不可重复。因此在JAVA VM(虚拟机)中有一个字符串池,专门用来存储字符串。如果遇到String a=”hello”时(注意没有NEW,不是创建新串),系统在字符串池中寻找是否有”hello”,此时字符串池中没有”hello”,那么系统将此字符串存到字符串池中,然后将”hello”在字符串池中的地址返回a。如果系统再遇到String b=”hello”,此时系统可以在字符串池中找到 “hello”。则会把地址返回b,此时a与b为相同。

String a=”hello”;
System.out.println(a==”hello”);
系统的返回值为true。

故如果要比较两个字符串是否相同(而不是他们的地址是否相同)。可以对a调用equal:
System.out.println(a.equal(b));
equal用来比较两个对象中字符串的顺序。 
a.equal(b)是a与b的值的比较。

注意下面程序:
student a=new student(“LUCY”,20);
student b=new student(“LUCY”,20);
System.out.println(a==b);
System.out.println(a.equal(b));
此时返回的结果均为false。
因为Student继承的是Object的equals()方法,此时toString()等于== 
为了实现对象的比较需要覆盖equals(加上这个定义,返回ture或false)
以下为实现标准equals的流程:
public boolean equals(Object o){
 if (this==o) return trun; //此时两者相同
 if (o==null) return false;
 if (! o instanceof strudent) return false; //不同类
 studeng s=(student)o; //强制转换
  if (s.name.equals(this.name)&&s.age==this.age) return true;
else return false;
}

 

例子:

 

import java.util.Date;
import java.util.GregorianCalendar;

/**
 * This program demonstrates the equals method.
 * @version 1.11 2004-02-21
 * @author Cay Horstmann
 */
public class EqualsTest
{
   public static void main(String[] args)
   {
      Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
      Employee alice2 = alice1;
      Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
      Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);

      System.out.println("alice1 == alice2: " + (alice1 == alice2));

      System.out.println("alice1 == alice3: " + (alice1 == alice3));

      System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));

      System.out.println("alice1.equals(bob): " + alice1.equals(bob));

      System.out.println("bob.toString(): " + bob);

      Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
      Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
      boss.setBonus(5000);
      System.out.println("boss.toString(): " + boss);
      System.out.println("carl.equals(boss): " + carl.equals(boss));
      System.out.println("alice1.hashCode(): " + alice1.hashCode());
      System.out.println("alice3.hashCode(): " + alice3.hashCode());
      System.out.println("bob.hashCode(): " + bob.hashCode());
      System.out.println("carl.hashCode(): " + carl.hashCode());
   }
}

class Employee
{
   public Employee(String n, double s, int year, int month, int day)
   {
      name = n;
      salary = s;
      GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
      hireDay = calendar.getTime();
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public Date getHireDay()
   {
      return hireDay;
   }

   public void raiseSalary(double byPercent)
   {
      double raise = salary * byPercent / 100;
      salary += raise;
   }

   public boolean equals(Object otherObject)
   {
      // a quick test to see if the objects are identical
      if (this == otherObject) return true;

      // must return false if the explicit parameter is null
      if (otherObject == null) return false;

      // if the classes don't match, they can't be equal
      if (getClass() != otherObject.getClass()) return false;

      // now we know otherObject is a non-null Employee
      Employee other = (Employee) otherObject;

      // test whether the fields have identical values
      return name.equals(other.name) && salary == other.salary && hireDay.equals(other.hireDay);
   }

   public int hashCode()
   {
      return 7 * name.hashCode() + 11 * new Double(salary).hashCode() + 13 * hireDay.hashCode();
   }

   public String toString()
   {
      return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay
            + "]";
   }

   private String name;
   private double salary;
   private Date hireDay;
}

class Manager extends Employee
{
   public Manager(String n, double s, int year, int month, int day)
   {
      super(n, s, year, month, day);
      bonus = 0;
   }

   public double getSalary()
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }

   public void setBonus(double b)
   {
      bonus = b;
   }

   public boolean equals(Object otherObject)
   {
      if (!super.equals(otherObject)) return false;
      Manager other = (Manager) otherObject;
      // super.equals checked that this and other belong to the same class
      return bonus == other.bonus;
   }

   public int hashCode()
   {
      return super.hashCode() + 17 * new Double(bonus).hashCode();
   }

   public String toString()
   {
      return super.toString() + "[bonus=" + bonus + "]";
   }

   private double bonus;
}

 

 

注:来源于网络

分享到:
评论

相关推荐

    1.javaObject类.zip

    1.javaObject类.zip1.javaObject类.zip1.javaObject类.zip1.javaObject类.zip1.javaObject类.zip1.javaObject类.zip1.javaObject类.zip1.javaObject类.zip1.javaObject类.zip1.javaObject类.zip1.javaObject类.zip1....

    Java Object 类高难度进阶版面试题集锦解析Java Object类高难度面试题及答案解析

    Java Object 类是所有Java类的根类,每个自定义的Java类都会无意识或有意识地继承Object类。Object类提供了几个核心的方法,这些方法在处理对象时非常关键,包括equals()、hashCode()、toString()、clone()、...

    Java Object类认识

    在Java编程语言中,`Object`类是所有类的根,每个自定义类如果没有明确指定父类,都默认继承自`Object`。因此,对`Object`类的理解是每个Java开发者的基本功。本文将深入探讨`Object`类,以及其核心方法`equals()`与...

    Java Object实例代码

    Java Object 类是所有Java类的根,它定义了所有对象都具有的基本行为。在这个实例代码中,我们将深入探讨七个关键知识点,它们是Java Object的基础,对于理解和使用Java编程至关重要。 1. **对象**: 在Java中,...

    Java Object类详解_动力节点Java学院整理

    Java Object类是所有Java类的根,它定义了一些基本的方法,这些方法在所有类中都可用。以下是Object类中的其他关键方法: 4. `toString()`: 这个方法返回一个表示当前对象的字符串。默认的实现返回类名加@加十六...

    Java Object类的常用方法详解与应用实践

    Object类的方法是Java编程的基础,它们为所有对象提供了基本的行为。掌握这些方法的用法和最佳实践,可以帮助我们编写出更加健壮、高效和可维护的Java代码。通过重写equals、hashCode和toString方法,我们可以确保...

    java-object类

    ### Java Object 类详解 #### 一、概述 `Object` 类是 Java 语言中最基础的类,位于 `java.lang` 包中。它是所有 Java 类的超类,即使程序员在定义一个新类时未明确指定该类继承自任何类,默认情况下,这个类也将...

    Java Object 类

    Object类位于java.lang包中,由于这个包是Java的标准库的一部分,所以在编译时会被自动导入,无需程序员手动引入。 在Java中,继承Object类有两种方式:显式继承和隐式继承。显式继承是通过在类声明中明确指定`...

    java之Object类用法实例

    Java中的`Object`类是所有Java类的根类,无论你定义的类是否显式地声明了父类,它都隐含地继承自`Object`类。`Object`类提供了许多基本的方法,使得我们能够对任何对象进行基本的操作。下面我们将深入探讨`Object`类...

    Java object类及正则表达式原理解析

    Java的Object类是所有Java类的根类,每个自定义的类如果不显式地声明其他父类,那么默认就会继承Object类。Object类中包含了一些基础的方法,如`equals()`、`hashCode()`、`toString()`等,这些方法在Java编程中扮演...

    详解Java中Object 类的使用.rar

    在Java编程语言中,Object类是所有类的根类,无论是自定义的还是Java库中的类,它们都直接或间接地继承自Object类。这个压缩包文件"详解Java中Object 类的使用.rar"包含了对Java中Object类的深入探讨,通过阅读其中...

    Object-CC++对象库,实现类似于Java的Object类的Object

    【Object-C】C++对象库,实现类似于Java的Object类的Object, (a C++ Object library, implementating an Object similar to Java s Object class,) 文件列表: CMakeLists.txt (1300, 2023-10-16) LibObjClangPlugin...

    JAVA之Object类所有方法

    在Java编程语言中,`java.lang.Object`是所有类的根类,无论是用户自定义类还是内置类,它们都直接或间接地继承自Object类。这个类提供了许多基础方法,这些方法对于对象的操作和管理至关重要。现在,我们将深入探讨...

    关于Java中Object类的几个方法示例

    Java Object类是Java编程语言中所有类的超类或基类,所有的Java类都直接或间接地继承自这个类。Object类位于Java的java.lang包中,提供了对象存活的最低限度的方法,即所有Java对象共有的方法。在Java编程中,Object...

    传入object比较排序的问题

    public class IntegrateComparator implements Comparator<Person>{ @Override public int compare(Person o1, Person o2) { int flag = 0; if (o1.getAge() ()){ flag = -1; } else if (o1.getAge() == o2....

    JAVA类源代码Object父类

    绝对正宗的Object父类JAVA源代码,加载到编译器Eclipse和Myeclipse编译器即可直接使用,还在为创建Object父类而烦恼吗,您是否正在寻找Object父类的源代码呢,如果是的话就请敢快动手吧。

    java Object转换为json

    此下载包含 POJO 中使用 json格式传递到页面所需要的包 POJO 中Object/Array/List/Map转换为json格式的语法 PS:下载了可以保证json方面完全没有问题的使用。 thia's all!!!

    Java的Object类讲解案例代码 equals()、hashCode()、finalize()、clone()、wait()

    这个源码资源是关于Java中的Object类的讲解案例代码。Object类是所有Java类的根类,它定义了一些常用的方法,例如equals()、hashCode()、toString()等。本案例代码将详细展示Object类的使用方法,并提供一些实际场景...

    ObjectToMapUtil.java(Object对象转Map)

    Java代码Object对象转Map

    java期末复习试题.doc

    - **Object 类:** `Object`类是所有Java类的直接或间接父类,因此每个类都继承自`Object`类。 **详细解释:** `Object`类是Java类层次结构的根,所有的Java类直接或间接地继承自`Object`类。这意味着所有Java类都...

Global site tag (gtag.js) - Google Analytics