`
blues1021
  • 浏览: 139595 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

用==和equals测试java对象的引用、浅拷贝、深拷贝和初始化区别

阅读更多

测试主要部分代码:public class Employee implements Cloneable,
                                 Comparable,
                                 Serializable{
    private String name;
   private double payRate;
   private int[] days;

 public void displayDays(){  //显示数组
        for(int i=0;i<5;i++)
        System.out.println(this.days[i]);
    }
    public void setDays(int i,int day){//设置数组
        days[i]=day;
    }
public Object cloneLight() throws CloneNotSupportedException //浅拷贝方法
   { 
   return super.clone();  //can use this to light copy
  } 

 
  public Object clone()throws CloneNotSupportedException {//深拷贝方法
   
     return new Employee (name, payRate, days);
     /*可以将属性传入,因构造函数执行了,属性初始化了deep copy
      或者使用:
          Employee e1=(Employee)super.clone();
          e1.days=days;//若为对象则e1.o1=(O1)o1.clone();
          rerurn e1;
     */
   }
/*其它设置方法略*/
 public static void main(String[] args){
 Employee emp1;
 Employee emp2=new Employee(实参1,实参2,实参3);//根据构造方法传入,此处略

try{
       //emp1=emp2;//引用的测试
       // emp1 = (Employee)emp2.cloneLight();//浅拷贝的测试
         emp1 = (Employee)emp2.clone();//深拷贝的测试
     }
     catch(Exception e){
         e.printStackTrace();
     }
     emp1.setDays(0,11);//重新设置
      System.out.println("Equals: " + emp1.equals(emp2));
      System.out.println("emp1's days array is:");
      emp1.displayDays();
      System.out.println("emp2's days array is:");
      emp2.displayDays();
   }
测试结果表明:
首先回顾上面所有的比较的==和equals的区别,==用于基本数据类型比较值,对象时同一个对象(来自同一个地址引用)才true;
euquals比较的是两者的值或者是否是同一个类的对象(而不管是否来自同一个地址引用)。
但是他们都不会去比较对象里面的数组或对象是否也相等。
1.
引用赋值只是将一个相同的地址的值 浅复制的传递给了另外一个变量或对象 ,故当用==时会相等。
2.
对象引用和浅拷贝都没有拷贝原对象的数组和对象成员 ,但是浅拷贝与引用的不同是构造了另一个引用(而不是相同的引用),故当==时不等而equals时相等 ;即java Object clone()若不重传入实参,且原对象中只有基本类型成员时可以实现对象拷贝分离。
3.对象深拷贝与上述1的拷贝的区别就是,
深拷贝连同原对象中的数组和对象成员(非基本类型)也一同拷贝了一份。
所以要使得两个对象维护自己的数据(而不是共享)则要用到深拷贝。
4.对象的构造,当然
如果原对象的构造数据不复杂也可以从新声明一个对象来实现

分享到:
评论

相关推荐

    JAVA面试题及答案二百多道

    Java提供了浅拷贝和深拷贝的概念。浅拷贝仅复制对象本身,而不复制其引用的对象。深拷贝不仅复制对象,还递归地复制所有引用的对象。可以通过实现Cloneable接口并重写`clone()`方法来进行深拷贝。 【设计模式】 ...

    Java实例高难度面试题及解析 - 展现你的编程实力!

    14. **对象生命周期**:从创建到销毁的过程,包括创建、初始化、使用和销毁。 15. **对象生命周期管理**:Java通过垃圾回收机制自动管理,当对象不再被引用时回收。 16. **释放资源**:实现`finalize()`方法,在...

    java面试100题,包含java基础等

    本文将对 Java 中的访问修饰符、运算符、垃圾回收机制、自动装箱和自动拆箱、类加载机制、异常层次结构、接口和抽象类、内部类、深拷贝和浅拷贝、String、StringBuilder 和 StringBuffer、集合框架、泛型、反射、...

    Java 200题详解.doc

    - Java中的对象拷贝分为浅拷贝和深拷贝。浅拷贝只复制对象的引用,深拷贝则创建新的对象并复制所有数据。 6. **Java Web**: - 包含Servlet、JSP、Filter、Listener等技术,是构建Web应用程序的基础。理解HTTP...

    JAVA面试的相关问题

    浅拷贝仅复制对象的引用,而深拷贝会创建一个新的对象,复制所有字段的值。`Cloneable`接口和`clone()`方法用于实现对象拷贝,但通常需要自定义拷贝逻辑以满足特定需求。 8. **Java Web**: - 包括Servlet、JSP、...

    Java 208道面试.docx

    - 类和对象:Java是一种面向对象的语言,所有的程序都是由类定义并创建对象来执行任务。 - 继承、封装和多态:这三个概念构成了面向对象编程的基础,继承允许子类继承父类的属性和方法,封装保护数据并提供公共...

    Java 全套面试题.doc

    Java中的对象拷贝有两种方式:浅拷贝和深拷贝。浅拷贝仅复制对象的引用,而深拷贝会创建新的对象并复制所有属性。clone方法可以实现浅拷贝,而序列化和反序列化可以实现深拷贝。 【JavaWeb】 JavaWeb开发涉及到...

    Java精选面试题.pdf

    - 浅拷贝和深拷贝:浅拷贝只复制对象的引用,深拷贝则复制对象本身及其所有引用的对象。 9. **JavaWeb** - **Servlet**:用于接收HTTP请求并生成响应的Java类。 - **JSP**:Java Server Pages,用于创建动态网页...

    Java常见面试题208道.docx

    - 深拷贝和浅拷贝:深拷贝创建完全独立的对象副本,而浅拷贝仅复制对象的引用。 **6. Java Web** - JSP和Servlet:JSP用于生成动态网页,而Servlet是Java Web中的后端处理组件。 - Session和Cookie:Session存储...

    李兴华老师的面向对象

    - **深拷贝与浅拷贝**:当需要复制对象时,需要注意深拷贝和浅拷贝的区别。浅拷贝只会复制对象的引用,而深拷贝会复制对象的所有内容。 #### 五、构造方法的使用 构造方法用于创建类的新实例,并为对象的属性进行...

    第七课 对象类型及相互转化.rar

    - 引用类型:存储对象地址,如对象引用`Person p = new Person();` 3. **对象创建**: 使用`new`关键字结合类的构造器来创建对象,如`Person p = new Person();`。构造器用于初始化新对象的状态。 4. **类与对象...

    java笔试面试大全-附答案

    - 浅拷贝与深拷贝:浅拷贝只复制对象的引用,深拷贝则创建完全独立的对象副本。 6. **Java Web**: - **Servlet**:处理HTTP请求的核心组件。 - **JSP**:用于生成动态网页内容,结合Java代码和HTML。 - **MVC...

    Java+最常见+216++面试题全解析.doc

    - 浅拷贝和深拷贝是复制对象时要考虑的概念,浅拷贝仅复制对象本身,深拷贝则连同引用的对象一起复制。 12. **Java Web** - Java Web开发涉及到Servlet、JSP、Filter、Listener等,理解它们的角色和交互方式是Web...

    java面试宝典

    - 理解深拷贝和浅拷贝的区别,以及它们在对象复制中的应用。 22. **Java中的泛型和类型安全** - 泛型提供了一种类型安全的解决方案,用于创建可复用的组件。 - 理解泛型如何消除类型转换的需要,并提高代码的...

    Java高级资深核心知识全面解析.pdf

    方法的重载和重写是多态性的体现,深拷贝和浅拷贝则关乎对象复制的深度。 面向对象编程是Java的核心,包括类、对象、封装、继承和多态。类是对象的模板,对象是类的实例。构造器用于初始化对象,可以被重载。成员...

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...

    java技术面试题2020版

    18. 编写`clone()`方法时,通常需要实现`Cloneable`接口并覆盖`clone()`,以创建对象的深拷贝或浅拷贝。 以上是对部分Java面试题的解析,这些内容对于理解和掌握Java编程语言及其应用至关重要,不仅适用于面试,也...

    Java面试八股文001-Java-Java基础

    - **深拷贝**:不仅复制对象的基本属性,还复制了对象所引用的对象,即递归地复制对象的所有属性。 **引用拷贝**:仅复制对象的引用地址,不复制对象本身。 #### 8. Java注解的理解 Java注解是一种元数据,用于向...

    Java面试八股文十万字总结.docx

    深拷贝和浅拷贝的区别** - **浅拷贝**:只复制对象本身,不复制引用的对象。 - **深拷贝**:不仅复制对象本身,还递归地复制所有引用的对象。 **19. final有哪些用法** - 修饰类:表示该类不可被继承。 - 修饰...

Global site tag (gtag.js) - Google Analytics