精华内容
下载资源
问答
  • java对象赋值、深拷贝与浅拷贝

    千次阅读 2020-10-09 17:46:43
    Java 应用当中将一个对象的值给到一个新的对象可以通过直接赋值和拷贝的方式进行,但两种方式我们应该清除他们之间的区别;...给新对象赋值并修改新对象: public static void main(String[] args){ User user1 = n

    Java 应用当中将一个对象的值给到一个新的对象可以通过直接赋值和拷贝的方式进行,但两种方式我们应该清除他们之间的区别;

    直接赋值(引用赋值)

    定义一个对象

    public class User {
    
        private String name;
    
        private Integer age;
    
        private String sex;
    }
    

    给新对象赋值并修改新对象:

     public static void main(String[] args){
            User user1 = new User();
            user1.setName("张三");
            user1.setAge(20);
            user1.setSex("男");
    
            //引用赋值
            User user2 = new User();
            user2 = user1;
            user2.setName("李四");
            user2.setAge(22);
    
            System.out.println("user1:"+user1);
            System.out.println("user2:"+user2);
    
    
        }
    

    结论:
    在这里插入图片描述
    在jvm里面对象的存储在堆和栈里面,其中
    栈:存放对象的基本变量和对象的引用
    栈:存放new出来的实例数据

    对象的直接赋值是将user1的引用地址赋值给了user2,当user2修改实例数据的时候是修改堆当中的数据,所以当user2修改完后我们再查看user1的数据时是被修改后的数据。
    在这里插入图片描述

    对象拷贝

    对象拷贝都是在堆内存当中重新分配一块内存并将数据赋值到新的对象,但是由于一个对象可能存在对于其他对象的引用,针对这样的情况,将拷贝又分为深拷贝和浅拷贝;
    浅拷贝:当一个对象引用别的对象时,对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝
    深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容

    举个例子:
    1.一个对象不包含对别的对象的引用,使用浅拷贝

    //拷贝需要实现CloneAble接口,并重写clone方法
    public class User implements Cloneable {
    
        private String name;
    
        private Integer age;
    
        private String sex;
    
        @Override
        public Object clone(){
            try {
                return super.clone();
            }catch (CloneNotSupportedException ignore){
    
            }
            return null;
        }
    }
    

    实现浅拷贝并修改其值:

        public static void main(String[] args){
            User user1 = new User();
            user1.setName("张三");
            user1.setAge(20);
            user1.setSex("男");
            //浅拷贝
            User user2 = (User)user1.clone();
            user2.setName("李四");
            user2.setAge(22);
    
            System.out.println("user1:"+user1);
            System.out.println("user2:"+user2);
    
        }
    

    结论: 对象的基本数据类型,浅拷贝修改user2对象值,并没有修改user1的值
    在这里插入图片描述
    2,一个对象包含了对别的对象的引用,使用浅拷贝

    public class Person {
    
        private String person;
    
    }
    public class User implements Cloneable {
    
        private String name;
    
        private Integer age;
    
        private String sex;
    
        private Person person;
    
        @Override
        public Object clone(){
            try {
                return super.clone();
            }catch (CloneNotSupportedException ignore){
    
            }
            return null;
        }
    }
    

    实现浅拷贝并修改其值:

     public static void main(String[] args){
            User user1 = new User();
            user1.setName("张三");
            user1.setAge(20);
            user1.setSex("男");
            Person person = new Person();
            person.setPerson("morning!");
            user1.setPerson(person);
            //浅拷贝
            User user2 = (User)user1.clone();
            user2.setName("李四");
            user2.setAge(22);
            //修改引用对象的值,还是会修改到user1
            user2.getPerson().setPerson("afternoon!");
    
            System.out.println("user1:"+user1);
            System.out.println("user2:"+user2);
    
        }
    

    结论:对于浅拷贝来说,对象的clone方法并不会把其对象中引用的其他对象进行拷贝
    在这里插入图片描述
    对与浅拷贝来说,如果包含对别的对象的引用,在内存中结构如下:浅拷贝对象的引用还是指向原来的引用对象,并没有重新复制一份给到新的对象

    在这里插入图片描述

    3,深拷贝,将对象引用的对象也一起复制给到新的对象形成一个新的对象

    实现深拷贝方式:
    1.对对象进行序列化操作,在赋值给新对象的时候反序列化
    2.实现clone方式
    我们通过实现clone方式来实现深拷贝:

    public class Person implements Cloneable{
        private String person;
        @Override
        public Object clone(){
            try {
                return super.clone();
            }catch (CloneNotSupportedException ignore){
    
            }
            return null;
        }
    }
    
    public class User implements Cloneable {
    
        private String name;
    
        private Integer age;
    
        private String sex;
    
        private Person person;
    
        @Override
        public Object clone(){
            try {
                //深拷贝
                User user = (User)super.clone();
                user.person = (Person)this.person.clone();
                return  user;
            }catch (CloneNotSupportedException ignore){
    
            }
            return null;
        }
    
     public static void main(String[] args){
            User user1 = new User();
            user1.setName("张三");
            user1.setAge(20);
            user1.setSex("男");
            Person person = new Person();
            person.setPerson("morning!");
            user1.setPerson(person);
    
            //深拷贝 对象已经实现clone方法
            User user2 = (User)user1.clone();
            user2.setName("李四");
            user2.setAge(22);
            //修改引用对象的值,不会修改到user1的引用对象的值
            user2.getPerson().setPerson("afternoon!");
    
            System.out.println("user1:"+user1);
            System.out.println("user2:"+user2);
    
        }
    

    结论:
    在这里插入图片描述

    展开全文
  • java对象赋值问题

    2019-02-17 21:13:22
    最近看FutureTask代码,里面有一...这个遍历一下又让我懵了一下,再次记录一下java值传递、函数传参的问题。  我理解 WaitNode p = waiters 相当于把 p 指向waiters引用的对象,不管 p=null 还是 waiters=null ,...

            最近看FutureTask代码,里面有一个方法时遍历等待FutureTask任务执行完毕的链表,链表节点中保持等待任务完成的被阻塞的线程。这个遍历一下又让我懵了一下,再次记录一下java值传递、函数传参的问题。

             我理解 WaitNode p = waiters 相当于把 p 指向waiters引用的对象,不管 p=null 还是 waiters=null ,都只是把这个引用指向null,jvm进行垃圾回收时判断是否有引用指向这个对象,没有就回收这个对象占用的内存空间。p=null 语句的执行不会对 waiters有任何影响,waiters=null 语句的执行当然也不会对 p 有任何影响。

              说到这里再记录一下java函数传参数的问题,java函数传参究竟是传值还是传引用呢。我理解可以记为java函数传参只是传值,不管参数是基本类型还是对象(当然这里指的是对象的其中一个引用)。基本类型就毫无争议了,传对象也是传一个引用的值,如果在函数中用这个引用操作对象当然会改变对象本身,但是在函数中对这个引用赋值一个新的对象引用,即为它new一个新的对象赋值给它,这个引用就指向另一个对象了。那么此时会改变参数中引用指向的对象吗?答案是不会的,因为函数会把这个引用值存于栈空间,只是拷贝了一个临时的引用,你使用 new object() 赋值给的只是这个临时引用。

               这个很像C++中函数参数传递传“指针”还是“引用”的区别,上述传参类似C++中传入的指针变量,不过注意C++中的引用可不是上面说的“java引用”。

    展开全文
  • java对象赋值的方式

    千次阅读 2021-02-12 09:20:54
    了解对对象赋值的方式2.了解静态方法和实例方法3.了解成员变量的作用域4.了解自定义构造方法和构造方法技术:1.对对象赋值的方式:a.对于public修饰的属性使用对象直接使用b.对于private修饰的属性不能直接使用只能...

    目的:

    1.了解对对象赋值的方式

    2.了解静态方法和实例方法

    3.了解成员变量的作用域

    4.了解自定义构造方法和构造方法

    技术:

    1.对对象赋值的方式:

    a.对于public修饰的属性使用对象直接使用

    b.对于private修饰的属性不能直接使用只能间接作用

    2.setter和getter方法

    给外部一个set方法通过这个方法间接给对象赋值,可以对外部给的值进行控制

    给外部一个get方法访问某个变量的值

    注意:建议将setter/getter方法定义在类的最后面避免干扰

    3.构造方法:创建一个类的一个对象的时候就会被调用的方法,在对象创建的时候 需要给属性赋值

    4.方法重载:同一个类型里面有多个同名的时候 就会被调用的方法但是返回值或者参数不同

    5.成员变量的作用域 :从对象创建到对象被销毁

    6.使用静态方法的类型:

    a.工厂模式 factory

    b.当不需要记录数据只关心功能就可以使用静态方法

    c.注意:静态方法不能调用外部非静态属性和方法

    技术的使用:

    1.类的默认构造方法:

    bc5e449448ff

    2.类的自定义构造方法:

    bc5e449448ff

    3.对象方法和静态方法

    bc5e449448ff

    心得:

    昨晚上布置的那个程序还是没有写出来就是感觉写到后面去了好多东西都不知道该怎么使用,刚开始的时候想的是定义一个二维数组来写可是写到后面去了自己感觉又不可以,所以又来重新想,但是思路一致不够清晰,听了课之后再在看写的代码还是太难了,下来还是要慢慢的看了。可能有些也不一定看得懂。

    展开全文
  • java 对象赋值问题

    千次阅读 2021-02-26 19:07:34
    import java.io.*;class CCircle{private static double pi = 3.1415;private double radius;public CCircle(double r) {radius = r;}public void show() {System.out.println("Area is "+pi*radius*radius);}publ.....

    import java.io.*;

    class CCircle{

    private static double pi = 3.1415;

    private double radius;

    public CCircle(double r)  {

    radius = r;

    }

    public void show()  {

    System.out.println("Area is "+pi*radius*radius);

    }

    public void SetRadius(double r)

    {

    radius = r;

    }

    public boolean compare(CCircle c2)

    {

    if(this.radius == c2.radius)

    return true;

    else

    return false;

    }

    public double GetRadius()

    {   return radius;  }

    };

    public class HelloWorld{

    public static void main(String args[])

    {

    CCircle cirl1,cirl2;

    cirl1 = new CCircle(1.0);

    System.out.println(cirl1.GetRadius());

    cirl2 = cirl1;

    System.out.println(cirl2.GetRadius());

    cirl2.SetRadius(3.0);

    System.out.println(cirl2.GetRadius());

    System.out.println(cirl2.GetRadius());

    System.out.println(cirl1.compare(cirl2));

    }

    }

    最后结果显示,两个对象是相等的。 CCircle cirl1,cirl2; cirl1 = new CCircle(1.0); cirl2 = cirl1; cirl2.SetRadius(3.0); 表达式: A a1 = new A(); 它代表A是类,a1是引用,a1不是对象,new A()才是对象,a1引用指向new A()这个对象。

    在JAVA里,“=”不能被看成是一个赋值语句,它不是在把一个对象赋给另外一个对象,它的执行过程实质上是将右边对象的地址传给了左边的引用,使得左边的引用指向了右边的对象。JAVA表面上看起来没有指针,但它的引用其实质就是一个指针,引用里面存放的并不是对象,而是该对象的地址,使得该引用指向了对象。在JAVA里,“=”语句不应该被翻译成赋值语句,因为它所执行的确实不是一个赋值的过程,而是一个传地址的过程,被译成赋值语句会造成很多误解,译得不准确。

    再如: A a2; 它代表A是类,a2是引用,a2不是对象,a2所指向的对象为空null;

    再如: a2 = a1; 【它代表,a2是引用,a1也是引用,a1所指向的对象的地址传给了a2(传址),使得a2和a1指向了同一对象。】

    综上所述,可以简单的记为,在初始化时,“=”语句左边的是引用,右边new出来的是对象。 在后面的左右都是引用的“=”语句时,左右的引用同时指向了右边引用所指向的对象。

    再所谓实例,其实就是对象的同义词。

    展开全文
  • 上节我们探讨了Java对象赋值原理,在此基础上引出了“别名现象”这一概念。本节将要讲解的是“方法调用中的别名问题”,将一个对象传递给方法时,也会产生别名问题。下面的这个例子将向大家阐释这一点: package...
  • java中对象给对象赋值

    2021-03-16 20:02:44
    java中对象给对象赋值 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行...
  • java对象赋值给另一个对象

    千次阅读 2021-03-05 19:56:29
    对基本数据类型的赋值很简单的。基本类型存储了实际的数值,而并非指向一个对象的引用,所以在赋值的时候,是...所以倘若“将一个对象赋值给另一个对象“的时候,实际上是将“引用”从一个地方复制到另一个地方。这...
  • java对象之间赋值

    2020-12-20 10:41:45
    第一种:使用org.apache.commons.beanutils....2.PropertyUtils有自动类型转换功能,而java.util.Date恰恰是其不支持的类型 3.PropertyUtils支持为null的场景; public static void copyProperties(Object dest, Ob
  • https://www.jianshu.com/p/37d8fa7efd7b
  • 对象赋值工厂工具类

    2017-04-25 15:03:35
    将一个对象的参数值赋值给另一个对象,并对他实例化,省去了麻烦的set操作 注:前提是两个对象赋值的字段的字段名一样
  • java对象赋值操作

    千次阅读 2015-08-16 15:14:20
    但是为对象赋值时,却有一点不一样;对一个对象进行操作的时候,我们真正操作的是对对象的引用。所以当将一个对象赋值给另一个对象,实际上是将对象的引用从一个地方赋值到另一个地方。当我么将一个对象赋值给另一个...
  • java中将数据库中数据直接赋值给Map对象,目的是为了方便取值,这种方式需要用到spring框架
  • 对象之间的属性赋值主要通过org....赋值前提 -- 两个对象要赋值的属性名需要保持一致对象赋值# 将source对象赋值给target对象BeanUtils.copyProperties(source, target);List之间的对象赋值/*** @param input 输入...
  • Java对象赋值与引用

    万次阅读 多人点赞 2017-07-28 19:52:34
    Java对象赋值与引用详解
  • java对象与Map相互转换,对象赋值另一对象 先来个阿里规范截图 Map转对象 import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSONObject; JSONObject.parseObject(JSONUtils....
  • Java对象不使用时赋值null的意义详解

    千次阅读 2021-02-25 18:54:57
    } } 再次运行程序,查看gc日志 由以上载图日志可以明显看到二者差别,所以不用对象置为null还是很有意义的。 为啥会造成二者的区别呢? 这还得从jvm认定垃圾的机制:可达性分析说起。 说起这个可达性,首先就得说到...
  • 关于Java对象数组赋值的问题

    千次阅读 2019-12-18 12:18:49
    在写Java大作业时需要对对象数组赋值,而我的程序在赋值完后,我发现对象数组中的每个对象都相同。 定义对象数组 读取文件中的数据,设置一个临时变量stu储存每一个对象的信息并赋值 上诉代码每次赋玩值后都输出第...
  • 基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到另一个地方。例如对基本数据类型使用a=b,那么b的内容就复制给a。若接着修改了a,而b根本不会受到这种...
  • java 子类对象赋值给父类对象的使用,包括代码及详解,个人笔记
  • 浅谈java对象引用及对象赋值

    千次阅读 多人点赞 2017-01-05 15:11:46
    一、Java对象及其引用  初学Java,总是会自觉或不自觉地把Java和C++相比较。在学习Java类与对象章节的时候,发现教科书和许多参考书把对象和对象的引用混为一谈。可是,如果分不清对象与对象引用, 那实在没法很...
  • java把一个对象赋值给另一个对象

    千次阅读 2021-01-15 10:28:33
    java把一个对象赋值给另一个对象 对象 class Car{ private String color; private String width; private String height; Car(){ } Car(String color,String width,String height){ this.color = color; ...
  • java 将一个对象赋值给另一个对象

    千次阅读 2019-12-11 10:53:16
    将一个对象user属性赋值给另一个对象userVo, BeanUtils.copyProperties(user,userVo);
  • JAVA赋值和C++赋值的区别

    千次阅读 2018-07-16 19:50:50
    前些时候在用JAVA实现哈希...赋值一般分为变量赋值和对象赋值,下面我们分别通过两段简单的代码来探究一下C++和JAVA中赋值操作的特点。 一、C++中的变量赋值和对象赋值 C++的测试代码段如下: #include<i...
  • 主要介绍了利用Java反射机制实现对象相同字段的复制操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 17.7.Non-Atomic Treatment of double and longFor the purposes of the Java programming language memory model, a single write to a non-volatile long or double value is treated as two separate writes: on....
  • java对象之间赋值详解

    万次阅读 2016-03-29 15:47:32
    赋值是用等号运算符(=)进行的。它的意思是“取得右边的值,把它复制到左边”。右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行。但左边的值必须是一个明确的、已命名的变量。也就是说,它必须有一...
  • 1.相同类型对象赋值 TeacherBase teacherBase = new TeacherBase(); BeanUtils.copyProperties(teacherBaseOld,teacherBase); 2.对象拷贝 类型完全相同才赋值,否则不覆盖 BeanCopier copier = BeanCopier.create...
  • JAVA对象赋值与引用

    万次阅读 2016-08-23 16:41:48
    前言最近在学习红黑树,当我尝试不使用递归来实现时,发现自己的...@Intopass的知乎回答 java到底是值传递还是引用传递 @focusChen的博客 JAVA 对象引用,以及对象赋值 一番折腾先找个对象过年class Node { int value;
  • 例一(单个对象进行赋值):@RequestMapping("test1.do")@ResponseBodypublic JSONObject test1(HttpServletRequest request, HttpServletResponse response) {JSONObject jsonObject = new JSONObject();jsonObject....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 564,895
精华内容 225,958
关键字:

java对象赋值

java 订阅
友情链接: RGBToYUV420.rar