`
nickdine
  • 浏览: 45686 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

赋值的真相

 
阅读更多
1 赋值是将右边的值复制给左边,右值是任何的常数变量和表达式,左值必须是一个明确的已命名的变量,就是必须是已经定义了物理空间用来存储值。 基本类型的赋值是复制,对基本类型a=b 之后要是改变a的值,不会影响到b的值 因为他们都是基本类型存放在栈中。
  而对于复杂的类型,为对象赋值则不是这样,对象的存储其实是在栈中放的是对象的引用,真正的储值是在堆中的,将一个对象赋值给另一个对象实际上是将该对象的引用赋给,这样就是栈中定义的两个变量引用了同一块的堆中的内容,结果是其中一个对象值发生变化,另一个也同样变化。此时的赋值 相当于给一个“别名”。
  因此 如果两个对象希望复制成员变量的值,需要对每个变量进行赋值,而不是对象直接复制。

java中 堆栈中存放的是变量的引用,真正的内容是放在堆中的,但是由于基本类型很小,所以也放在堆栈中。
package cn.tommy.learning.tij;

import i.tommy.utils.printUtil;
import static i.tommy.utils.printUtil.*;
public class refObjectTest
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		Person a=new Person();
		Person b=new Person();
		a.age=32;
		b.age=25;
		print("first: age of a:"+a.age+"; age of b"+b.age);
		a=b;
		print("first: age of a:"+a.age+"; age of b"+b.age);
        a.age=67;
        print("first: age of a:"+a.age+"; age of b"+b.age);
        a.age=31;
        print("first: age of a:"+a.age+"; age of b"+b.age);
        
        
	}

}

class  Person
{
int age;	
}


结果:
first: age of a:32; age of b25(2)
first: age of a:25; age of b25(2)
first: age of a:67; age of b67(2)


2
如果main函数改成
package cn.tommy.learning.tij;

import i.tommy.utils.printUtil;
import static i.tommy.utils.printUtil.*;
public class refObjectTest
{
           Person a=new Person();
		Person b=new Person();
		a.age=32;
		b.age=25;
		print("first: age of a:"+a.age+"; age of b"+b.age);
		a.changeAge(b);
		print("first: age of a:"+a.age+"; age of b"+b.age);
       
	}

}

class  Person
{
int age;	
public void changeAge(Person  p)
{
	p.age=43;
	}
}
 


结果
first: age of a:32; age of b25(2)
first: age of a:32; age of b43(2)
分享到:
评论

相关推荐

    计算机程序设计:第4讲 数据类型(下).ppt

    例如,解决类似犀利哥故事中的问题时,需要通过逻辑分析和条件判断来确定真相。在这个例子中,我们可能需要使用逻辑运算符来判断每个人的陈述是否一致,从而找出“八卦者”。 总之,掌握这些运算符的使用对于编写...

    C#常用知识点简单回顾(有图有真相)

    1)传值调用与引用调用 代码如下: using System; class MethodCall { public static void Main() { /* * 参数类型分为 in, ref, out 三种,... Console.WriteLine(“Before Method Call : a = {0}, b = {1}, c 未赋值”

    基于舆情事件演化分析及改进KE-SMOTE算法的舆情反转预测研究.docx

    本文对舆情反转的研究方法进行了改进,首先将基于反转事件整个演化过程赋值的特征去除,仅保留可以依据事件反转前的演化特点及演化过程解释的特征;其次,对文献[6]中使用的671个热点舆情事件,根据提出的取值依据...

    7-4Python函数之返回多值.pdf

    这揭示了Python函数返回“多值”的真相——返回一个隐式创建的元组。 现在转向任务部分,我们要编写一个函数来求解一元二次方程。一元二次方程的标准形式是`ax² + bx + c = 0`。Python的`math`包提供了一些数学...

    jQuery Making JavaScript fun again

    2. **JavaScript的误解与真相** - 常被误认为是Java的一部分,实则两者无关。 - 被视为“只用于骚扰人”的工具,实际上,可用性问题并不完全归咎于JavaScript。 - 尽管有人声称“只因为不得不才使用它”,但...

    JavaBDD用法笔记1

    3. `printSet()`方法是一个重要的辅助工具,用于以文本格式输出由BDD表示的真赋值集。这有助于理解BDD所表示的布尔表达式的真相表。 4. `printTable(BDD)`方法用于打印BDD的节点表,显示自底向上的BDD节点连接情况...

    【03-流程控制与数组】

    • 对于任何的if else 语句,表面上看起来else后没有任何条件,或者else if后只有一个条件,但这不是真相:因为 else的含义是“否则”,else本身就是一个条件!else 的隐含条件就是对前面条件取反。 switch...

    Delphi精要

    - **赋值运算符**:`=` - **比较运算符**:`=`、`<>`(不等于)、`、`>`、`、`>=` - **逻辑运算符**:`not`、`and`、`or`、`xor` - **算术运算符**:`+`、`-`、`*`、`/`、`div`(整除)、`mod`(取模) - **按位...

    deollvm64:Deobfuscator llvm arm64脚本

    《deollvm64:深度解析LLVM ARM...它结合了Python的灵活性和LLVM的编译器基础设施,旨在揭开混淆的迷雾,揭示隐藏在混淆代码背后的真相。理解并掌握这些技术对于提升软件安全性,防止恶意代码的传播,具有深远的意义。

    adamalbarghouthi

    引用的“如果真有失落在鲜血中的真相”,可能是一句引人深思的话,但在这里它可能并不直接关联到技术知识点,更可能是个人情感或哲学观点的表达。 在标签中提到了“JavaScript”,这表明这个项目与JavaScript编程...

    Laverdaderamovie

    从名称来看,它可能涉及到电影的展示、评论或者与真实世界中的电影"La Verdad"(西班牙语,意为“真相”)有关。然而,由于没有提供具体的项目详情,我们将主要围绕JavaScript这个标签来展开讨论JavaScript在Web开发...

    delphi精要 pdf

    - **赋值运算符**: `:=`,用于将右侧表达式的值赋给左侧变量。 - **比较运算符**: 如`=`, `, `>`, `, `>=`, `<>`,用于比较两个值是否相等或大小关系。 - **逻辑运算符**: 包括`not`, `and`, `or`, `xor`,用于进行...

Global site tag (gtag.js) - Google Analytics