CS61b笔记 2.1

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改变的原因。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值