1.一个关于赋值的小练习--海象之谜:Walrusa=newWalrus(1000,8.3);Walrusb;b=a;b.weight=5;System.out.println(a);System.out.println(b);最后a和b都会变成5,因为对象的赋值是把a和b同时指向内存块,也就是说同一个内存块和int是不同的x=5;inty;y=x;x=2;System.out.println("x是:"+x);System.out.println("y是:"+y);将x赋给y后也就是说,改变x的值不会改变y的值2.原始typejava语言没有提供让你知道变量具体内存地址的方法。不像C,这省去了我们对内存的管理,就像你知道你的心一直在跳动,但你不能在一个精确的时刻优化它的速率,唯恐你犯了一个错误就把它关掉了。java声明一个变量后,并没有给它赋初值(原始类型),所以当你要使用你声明的变量时,必须先给它赋初值。java的赋值操作是将y的位复制到x8基本类型:byte、short、int、long、float、double、boolean、char3。java引用类型的存储,比如intx,x在内存中的地址是200-250,那么java会创建一个box来存放x的第一个数据,也就是200。当我们声明一个引用类型的变量时,java会自动分配一个64bit的盒子,不管你存什么类型的变量比如WalrussomeWalrus;someWalrus=newWalrus(1000,8.3);第一行创建了一个存储大小为64位的someWalrus盒子。第二行使用new关键字创建了一个大小为96bit的double+int实例。new返回它的第一个数据的地址,它存在someWalrus,这就解释了为什么64bit大小的box保存96bit大小的实例,因为它只存储它的地址而不是真正的数据值`WalrussomeWalrus;someWalrus=null;`如果我们赋值someWalrus为null,然后someWalrus存储64个0。为此,如果一个方框符号(someWalrus)的值全为0,则表示为null。如果一个框符号值不为0,则表示它通过箭头指向一个对象实例。综上所述,当我们执行这段代码时:Walrusa=newWalrus(1000,8.3);海象b;b=一个;b.weight=5;创建盒子a,存储newWalrus(weight1000,size8.3)的地址,创建盒子b,尚未赋值,但不为空。b=a表示将a中存储的内存位信息复制到b中,所以a和b同时指向Walrus(weight1000,size8.3),所以改变b.weight也会改变a,也就是引用类型和原始类型的区别。4.参数传递publicstaticdoubleaverage(doublea,doubleb){return(a+b)/2;}在main函数中:doublex=5.5;doubley=10.5doubleavg=average(x,y);传递参数时,也遵循GoldenRuleofEqual,即average函数创建两个新的boxesx,y。这两个x,y都有自己的作用域。传递参数时,他们只是将x,yinmain复制成x,yinaverage。5.加深理解的练习:publicstaticvoidmain(String[]args){Walruswalrus=newWalrus(3500,10.5);整数x=9;doStuff(海象,x);System.out.println(海象);System.out.println(x);}publicstaticvoiddoStuff(WalrusW,intx){W.weight=W.weight-100;x=x-5;}请判断x和walrus的打印值解决问题的关键是理解java存储原始类型变量和引用类型变量的区别。后者的box存储的是walrus实例对象的地址,指向walrus(数据存在的地方),而前者直接存储的是它的值数据,所以无论是函数传参还是赋值操作,本质上都是复制存储在walrus中的位盒子并将其放入新盒子中。所以在这道题中,publicstaticvoiddoStuff(WalrusW,intx);首先创建了两个空盒子W和x,在main中执行doStuff(walrus,x)的时候,将main中walrus和x盒子里的值复制过来传给doStuff,我们知道walrus里面存放的地址是64bit的,而x存储的是一个32位的值,所以这样的结果是:doStuff中的W和main中的walrus存储在同一个地址,所以它们都指向Walrus(3500,10.5),因为x在main中是只是存储的值而不是地址。函数传参时,x的值是复制过去的,函数本身是有作用域的,所以函数中x的减法不会影响main中的x。最终输出为Walrus(3400,10.5)x=9保持引用类型不变,数组int[]a;a=newint[]{1,2,3};第一行是创建一个大小为64bit的盒子,第二行创建一个大小为3X32bit的盒子来存储数据,然后传递新的keyword返回首地址,=赋值给首框,即首框存放数组首地址。整个过程是:声明---实例化---赋值现在a是唯一存储实例对象的{1,2,3}地址框,如果我们设置a=newint[]{4,5,6};那么{1,2,3}的初始地址就会丢失,我们就再也找不到这个对象了,就会被垃圾回收器回收
