今天看了Thinking in Java 3rd Edition有感,突然发现自己基本功好不扎实,依然停留在应用层的操作上,并没有真正的深入到底层看看,写段经常会忽视的问题吧——赋值,愿大家不要拍我哦!
package com.lj.test;
class Number{
int i;
}
public class Test {
public static void main(String[] args) {
Number n1 = new Number();
Number n2 = new Number();
n1.i = 9;
n2.i = 47;
System.out.println("1:n1.i="+n1.i+",n2.i="+n2.i);
n1 = n2;
System.out.println("2:n1.i="+n1.i+",n2.i="+n2.i);
n1.i = 27;
System.out.println("3:n1.i="+n1.i+",n2.i="+n2.i);
}
}
猜猜结果会是啥样呢?
1:n1.i=9,n2.i=47
2:n1.i=47,n2.i=47
3:n1.i=27,n2.i=27
开始我们实例化了两个对象n1和n2,并且对其i值都赋予相应的值。然后吧n2赋值给n1,再修改n1。在很多别的编程语言里,你可以设想n1和n2自始至终都是两个独立的对象。但在Java里面,对n1的修改会影响到n2!我们可以看出这时n1和n2使用同一块内存,而原来的n1对象所占用的内存则会被垃圾回收器清理掉。我个人认为,我们在赋值操作时经常会马虎的认为会输出结果:3:n1.i=27,n2.i=47。
下面我参考Thinking in Java 3rd Edition又做个了例子发现,在方法调用的时候,传递参数时也要注意:
package com.lj.test;
class Number{
int i;
}
public class Test {
public static void f(Number n){
n.i = 88;
}
public static void main(String[] args) {
Number n3 = new Number();
n3.i = 33;
System.out.println("n3.i:"+n3.i);
f(n3);
System.out.println("n3.i:"+n3.i);
}
}
输出结果为:
n3.i:33
n3.i:88
通过两个例子我总结一下吧,在基础类型的赋值时是对值的复制操作,而对对象的赋值则是内存地址引用操作(包括以对象为参数的也是内存地址的引用操作),当多个对象都引用了此内存地址时,其中任何一个对象发生改变 其他引用同一块内存的对象也会受到影响。
分享到:
相关推荐
9.java赋值运算符.zip9.java赋值运算符.zip9.java赋值运算符.zip9.java赋值运算符.zip9.java赋值运算符.zip9.java赋值运算符.zip9.java赋值运算符.zip9.java赋值运算符.zip9.java赋值运算符.zip9.java赋值运算符.zip...
30.java赋值运算符.zip30.java赋值运算符.zip30.java赋值运算符.zip30.java赋值运算符.zip30.java赋值运算符.zip30.java赋值运算符.zip30.java赋值运算符.zip30.java赋值运算符.zip30.java赋值运算符.zip30.java赋值...
当我们创建一个子类对象并将其赋值给父类引用时,这种行为被称为向上转型(Upcasting)。这一过程是自动且安全的,因为子类对象包含了父类的所有属性和方法。下面我们将深入探讨这个主题,包括它的原理、示例代码...
综上所述,Java中的字符赋值涉及到变量声明、转义序列、Unicode编码、字符串与字符转换、字符操作以及I/O流等多个方面。在实际编程中,理解和熟练运用这些概念对于编写高效且可读性强的代码至关重要。
java代码-使用java增强for循环 string数组赋值的源代码 ——学习参考资料:仅用于个人学习使用!
java赋值运算符
由于`value`字段被声明为`final`,这意味着一旦赋值,它的值就不能改变。这是Integer对象的一个特殊性,它使得我们不能直接通过修改对象的属性来改变Integer对象的值。 在Java中,当我们把一个Integer对象作为参数...
### Java反射机制详解:给指定字段赋值 在Java编程语言中,反射是一个非常强大的功能,它允许程序在运行时检查或“反映”自身,并直接操作内部属性(如类、方法和字段)。本文将深入探讨如何利用Java反射来访问并...
对于"赋值语句的翻译程序 编译原理 Java"这个主题,我们将深入探讨赋值语句在编程中的作用,编译原理的基本概念,以及如何使用Java来实现这样的翻译工具。 **赋值语句**是编程中最基础的元素之一,它用于改变变量的...
NDK开发时,C/C++调用Java的函数的一些案例; 传递int类型参数: https://blog.csdn.net/niuba123456/article/details/80978500 传递String类型参数: https://blog.csdn.net/niuba123456/article/details/80978916 ...
使用反射技术对java实体类进行操作,得到所有属性并赋值给属性
本文将详细介绍 Java 中数组赋值的几种方法,并提供相应的示例。 首先,我们来看**逐个赋值**。这种方法适用于数组元素需要独立设置的情况。例如,创建一个整型数组 `int[] arr`,我们可以直接通过索引来给每个元素...
Spring Boot 前后端传参实现 Spring Boot 框架提供了多种方式来实现前后端传参,包括使用 `@PathVariable`、`@RequestParam`、`@RequestBody` 等注解。本文将详细介绍这些注解的使用方法和示例代码。 使用 `@...
在Java开发中,特别是在使用Spring框架时,将数据库中的数据转换为Map对象是一种常见的操作。这样做可以简化数据处理,使得数据以键值对的形式存储,便于快速查找和使用。Spring框架提供了强大的数据访问抽象,包括...
然而,在实际开发中,我们经常需要将枚举值反向映射到实体类的属性上,以便在处理表单提交的数据时进行赋值。这可以有效地减少代码的冗余,提高可读性和维护性。本文将详细探讨如何创建一个工具类来实现这个功能。 ...
### Java中的赋值运算符、拷贝初始化及this指针详解 #### 一、赋值运算符与拷贝初始化 1. **赋值与初始化的区别**: - **初始化**通常发生在对象创建时,比如使用构造函数设定初始状态。 - **赋值**则是在对象...
在Java编程语言中,赋值运算符是用来将值分配给变量的符号,它们在程序中起着至关重要的作用。本文将深入探讨Java中的赋值运算符及其功能。 首先,最基础的赋值运算符是“=”。它将右边的值赋给左边的变量。例如,`...
在 Java 中,连等赋值是一种常见的赋值方式,但是,当我们使用连等赋值时,会出现一些意外的结果。本文将通过示例代码详细介绍 JAVA 连等赋值问题,并分析连等赋值的执行过程,从而帮助大家更好地理解 Java 的赋值...
FPGA中阻塞赋值与非阻塞赋值原理实验 FPGA(Field-Programmable Gate Array)是一种基于可编程逻辑器件的数字电路设计技术。其中,阻塞赋值和非阻塞赋值是两个非常重要的概念,它们之间的区别和应用场景对FPGA设计...
在Java编程语言中,String类型变量的赋值问题是一个重要的概念,主要涉及到对象引用和不可变性。这里我们将深入探讨这两个关键点。 首先,Java中的String类是不可变的,这意味着一旦创建了一个String对象,就不能...