动力节点口口相传的Java黄埔军校
java中object类的常用方法有哪些?
2019-09-16 来源:动力节点

  

今天动力节点java培训机构小编为大家介绍“java中object类的常用方法”,希望通过此文大家能够知道object类的常用方法,下面就随小编一起看看java中object类的常用方法有哪些?


u=4195299513,2392537383&fm=11&gp=0.jpg


一、clone


  1、clone()方法


  在实际编程过程中,常常遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的。实现clone()方法是满足需求最简单,也是最高效的手段。


  clone()将返回Object对象的一个拷贝。要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。


  2、例子


public class Test implements Cloneable{

    private double value;


    public Test(double value) {

        this.value = value;

    }


    public void setValue(double value) {

        this.value = value;

    }


    public double getValue() {

        return this.value;

    }


    public Object clone() {

        Test copy = null;

        try {

            copy = (Test) super.clone();

        } catch (CloneNotSupportedException e) {

            e.printStackTrace();

        }

        return copy;

    }

}


public class Main {

    public static void main(String[] args) {

        Test dh = new Test(100.00);

        Test dhClone = (Test) dh.clone();


        System.out.println("Original:" + dh.getValue()); //Original:100.0

        System.out.println("Clone :" + dhClone.getValue()); //Clone :100.0


        dh.setValue(200.00);

        dhClone.setValue(400.00);


        System.out.println("Original:" + dh.getValue()); //Original:200.0

        System.out.println("Clone :" + dhClone.getValue()); //Clone :400.0

    }

}

  

3、Shallow Cloning


public class Test {

    private double value;


    public Test(double value) {

        this.value = value;

    }


    public void setValue(double value) {

        this.value = value;

    }


    public double getValue() {

        return this.value;

    }


public class ShallowClone implements Cloneable {

    public Test holder = new Test(0.0);

    public Object clone() {

        ShallowClone copy = null;

        try {

            copy = (ShallowClone) super.clone();

        } catch (CloneNotSupportedException e) {

            e.printStackTrace();

        }

        return copy;

    }

}


public class Main {

    public static void main(String[] args) {

        ShallowClone  dh = new ShallowClone();

        dh.holder.setValue(100.00);

        ShallowClone  dhClone = (ShallowClone ) dh.clone();


        System.out.println("Original:" + dh.holder.getValue()); //Original:100.0

        System.out.println("Clone :" + dhClone.holder.getValue()); //Clone :100.0


        dh.holder.setValue(200.00);


        System.out.println("Original:" + dh.holder.getValue()); //Original:200.0

        System.out.println("Clone :" + dhClone.holder.getValue()); //Clone :200.0

    }

}


  此例子中当ShallowClone类使用super.clone()调用Object类的clone()方法时,它会接收自身的浅拷贝。也就是说,它与其克隆共享其实例变量中使用的holder对象。


  4、Deep Cloning


  在深层克隆中,需要克隆对象的所有引用实例变量引用的所有对象。

 

public class Test implements Cloneable{

    private double value;


    public Test(double value) {

        this.value = value;

    }


    public void setValue(double value) {

        this.value = value;

    }


    public double getValue() {

        return this.value;

    }


    public Object clone() {

        Test copy = null;

        try {

            copy = (Test) super.clone();

        } catch (CloneNotSupportedException e) {

            e.printStackTrace();

        }

        return copy;

    }

}


public class DeepClone implements Cloneable {

    public Test holder = new Test(0.0);

    public Object clone() {

        DeepClone copy = null;

        try {

            copy = (DeepClone) super.clone();

            copy.holder = (Test) this.holder.clone();

        } catch (CloneNotSupportedException e) {

            e.printStackTrace();

        }

        return copy;

    }

}


public class Main {

    public static void main(String[] args) {

        DeepClone dh = new DeepClone();

        dh.holder.setValue(100.00);

        DeepClone dhClone = (DeepClone) dh.clone();


        System.out.println("Original:" + dh.holder.getValue()); //Original:100.0

        System.out.println("Clone :" + dhClone.holder.getValue()); //Clone :100.0


        dh.holder.setValue(200.00);


        System.out.println("Original:" + dh.holder.getValue());  //Original:200.0

        System.out.println("Clone :" + dhClone.holder.getValue()); //Clone :100.0

    }

}



  二、equals


  1、概述


  equals 方法默认比较的是两个对象的引用是否指向同一个内存地址。hashCode 是一个 native 本地方法,默认的 hashCode 方法返回的就是对象对应的内存地址。


  equals 方法是基类 Object 的方法,创建的所有的对象都拥有这个方法,并有权利去重写这个方法。该方法返回一个 boolean 值,代表比较的两个对象是否相同,这里的相同的条件由重写 equals 方法的类来解决。

  

String str1 = "abc";

String str2 = "abc";

str1.equals(str2);//true


  String 类重写了 equals 方法,否则两个 String 对象内存地址肯定不同。


  2、equals()方法的实现的规范


  假设x,y和z是三个对象的非空引用。


  自反性。表达式x.equals(x)应该返回true。


  对称性。如果x.equals(y)返回true,y.equals(x)必须返回true。


  传递性。如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)必须返回true。


  一致性。如果用于equals比较的对象信息没有被修改的话,多次调用时 x.equals(y) 要么一致地返回 true 要么一致地返回 false。


  与空引用的比较:任何类的对象不应等于空引用。表达式x.equals(null)应始终返回false。


  3、equals 与 == 的区别


  (1)若 == 两侧都是基本数据类型,则判断的是左右两边操作数据的值是否相等


  (2)若 == 两侧都是引用数据类型,则判断的是左右两边操作数的内存地址是否相同。若此时返回 true , 则该操作符作用的一定是同一个对象。


  (3)Object 基类的 equals 默认比较两个对象的内存地址,在构建的对象没有重写 equals 方法的时候,与 == 操作符比较的结果相同。


  (4)equals 用于比较引用数据类型是否相等。在满足equals 判断规则的前体系,两个对象只要规定的属性相同我们就认为两个对象是相同的。


public class Test {

    public String name="abc";

    public static void main(String[] args) {

        Test test=new Test();

        Test testb=new Test();

        String a=new String("a");

        String b=new String("a");

        System.out.println(test.equals(testb));//false

        System.out.println(test==testb);//false

        System.out.println(test.name.equals(testb.name));//true

        System.out.println(a==b);//false

        System.out.println(a.equals(b));//true

    }   

}


  4、equals()和hashCode()的联系


  调用 equals 返回 true 的两个对象必须具有相等的哈希码。


  如果两个对象的 hashCode 返回值相同,调用它们 equals 方法不一返回 true 。



  三、getClass


  Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。


  一般情况下,getclass()方法和class方法是等价的,都可以获得一个类型名,例:


class A{

    public void func(){


    }

}


public class Test {

    public static void main(String[] args) {

        A a = new A();

        System.out.println(a.getClass()+" "+A.class); //class A class A

    }

}


  getclass()和class的区别


  getClass() 是一个类的实例所具备的方法,而class() 方法是一个类的方法。


  getClass() 是在运行时才确定的,而class() 方法是在编译时就确定了。



  四、toString


  toString()是Object类的一个公有方法,而所有类都继承自Object类。所以所有类即使不实现toString方法,也会存在从Object类继承来的toString。Object类提供了toString()方法的默认实现。它返回一个以下格式的字符串:


  <fully qualified class name>@<hash code of object in hexadecimal>


例子:

import java.util.ArrayList;


public class ObjectDemo {

   public static void main(String[] args) {


      Integer i = new Integer(50);


      ArrayList list = new ArrayList();


      list.add(50);

      list.add("Hello World");


      System.out.println("" + i.toString());  //50

      System.out.println("" + list.toString()); //[50, Hello World]

   }

}


  类可以实现toString方法,在控制台中打印一个对象会自动调用对象类的toString方法,所以我们可以实现自己的toString方法在控制台中显示关于类的有用信息。

 

public class Main{

  public static void main(String[] argv){

    MyClass obj  = new MyClass(123);

    String objStr = obj.toString();

    System.out.println(objStr);

  }

}

class MyClass {

  private int value;


  public MyClass(int value) {

    this.value = value;

  }


  public void setValue(int value) {

    this.value = value;

  }


  public int getValue() {

    return value;

  }


  public String toString() {

    String str = String.valueOf(this.value);

    return str;

  }

}


以上就是动力节点java培训机构小编介绍的“java中object类的常用方法有哪些?”的内容,希望对大家有帮助,更多java最新资讯请继续关注动力节点java培训机构官网,每天会有精彩内容分享与你。


相关免费视频教程推荐


java入门学习零基础教程下载——Object类简介:http://www.bjpowernode.com/xiazai/2586.html


开班信息

同类文章

微信搜索“动力节点Java学院“或扫二维码

关注官方微信免费领学习资料

动力节点Java培训机构,行业口碑最好的Java培训机构。

立即抢名额