1.海象之谜一节知识点与题目 |
代码:
1 2 3 4 5 6 7 8 9 | public static class Walrus { public int weight; public double tuskSize; public Walrus(int w, double ts) { weight = w; tuskSize = ts; } } |
1 2 3 4 5 6 | Walrus a = new Walrus(1000, 8.3); Walrus b; b = a; b.weight = 5; System.out.println(a); System.out.println(b); |
改变了b的体重确实会改变a的,即便a最初被设置为体重为1000.
a和b如果用图示表示就是均有一个箭头指向new创造的一个对象。
这种情况仅使用于参考类型如String,类等除去基本类型以外的情况。
一旦采用了new创造了一个海象,就会有两个框被制造。
它们的初始值均为0,通过构造函数为他们赋值。
new的返回值就是海象的地址。‘
我们制造一个Walrus的时候:
Eg.Walrus somewalrus;
这时候java会有一个一个64位的盒子存储它的位置,如果之后跟了new,就存储new的位置
否则就是初始化的0.
Walrus a = newWalrus(1000, 8.3);
就是一个盒子a指向一个new出来的空间。
如果这是b=a,就是b也指向a的那只海象。修改b.weight就是顺着b的地址找到weight修改它。
因为a和b其实都是一只海象的地址,所以再输出a.weight就会发现weight已经改变了。
相关题目(期中试卷)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class Dada { private Dada[] r; private static Dada[] rs; private String name; public Dada(String n) { name = n; } /** Prints out the given array, i.e. if d contains two Dadas * with names "alice" and "bob", this method will print "alice bob". */ private static void printDadaArray(Dada[] d) { for (int i = 0; i < d.length; i += 1) { System.out.print(d[i].name + " "); } System.out.println(); } public static void main(String[] args) { Dada a = new Dada("alice"); Dada b = new Dada("bob"); Dada c = new Dada("carol"); Dada d = new Dada("dan"); Dada[][] twod = {{a, b}, {c, d}}; a.r = twod[1]; printDadaArray(a.r); // carol dan Dada.rs = a.r;// data.rs指向了a.r指向的位置,该位置是twod[1]所在的位置。 b.r = Dada.rs;//b.r指向了Data.rs的位置 b.r = new Dada[]{d, c};//b.r现在指向了new出来的新位置 Dada.rs[1] = new Dada("eve");//Data在之前a.r的基础上改变了第二个字符串 因为Data.rs和a.r指向的东西是一样的,现在a.r指向的值也改变了 printDadaArray(Dada.rs); // carol eve printDadaArray(b.r); // dan carol printDadaArray(twod[0]); // alice bob printDadaArray(twod[1]); // carol eve } } |
相关知识点:
函数传递:
Java的特点是按值传递:在调用函数的时候,只是复制所要传递的东西如下例中的fillOne(c.r[0]),我们只是复制了c.r[0]中的东西将它赋值给Data d,这意味着在fillone操作结束后,c.r[0]中的东西不改变。
c.r存储的是一个地址,在fillOne中它将c.r指向的内容twod[0]的值复制给了d,这不改变c.r所指内容的值,因为c.r[0]中是内容而不是地址。
但是在fillMany中传递的是c.r的地址,改变的是c.r地址所指的内容,这就是c.r所指内容在fillOne不改变而fillMany改变的原因。