栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

CS61b笔记 2.1

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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; }

 

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/831522.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号