当前位置:天才代写 > tutorial > JAVA 教程 > java的赋值

java的赋值

2017-11-13 08:00 星期一 所属: JAVA 教程 浏览:513

赋值是用等号运算符(=)举办的。它的意思是“取得右边的值,把它复制到左边”。右边的值可以是任何常数、变量可能表达式,只要能发生一个值就行。但左边的值必需是一个明晰的、已定名的变量。也就是说,它必需有一个物理性的空间来生存右边的值。举个例子来说,可将一个常数赋给一个变量(A=4;),但不行将任何对象赋给一个常数(好比不能4=A)。
对主数据范例的赋值长短常直接的。由于主范例容纳了实际的值,并且并非指向一个工具的句柄,所以在为其赋值的时候,可未来自一个处所的内容复制到另一个处所。譬喻,假设为主范例利用“A=B”,那么B处的内容就复制到A。若接着又修改了A,那么B基础不会受这种修改的影响。作为一名措施员,这应成为本身的知识。
但在为工具“赋值”的时候,环境却产生了变革。对一个工具举办操纵时,我们真正操纵的是它的句柄。所以倘若“从一个工具到另一个工具”赋值,实际就是将句柄从一个处所复制到另一个处所。这意味着假使为工具利用“C=D”,那么C和D最终城市指向最初只有D才指向的谁人工具。下面这个例子将向各人阐示这一点。
这里有一些题外话。在后头,各人在代码示例里看到的第一个语句将是“package 03”利用的“package”语句,它代表本书第3章。本书每一章的第一个代码清单城市包括象这样的一个“package”(封装、打包、包裹)语句,它的浸染是为那一章剩余的代码成立章节编号。在第17章,各人会看到第3章的所有代码清单(除那些有差异封装名称的以外)城市自动置入一个名为c03的子目次里;第4章的代码置入c04;以此类推。所有这些都是通过第17章展示的CodePackage.java措施实现的;“封装”的根基观念会在第5章举办详尽的表明。就今朝来说,各人只需记着象“package 03”这样的形式只是用于为某一章的代码清单成立相应的子目次。
为运行措施,必需担保在classpath里包括了我们安装本书源码文件的根目次(谁人目次里包括了c02,c03c,c04等等子目次)。
对付Java后续的版本(1.1.4和更高版本),假如您的main()用package语句封装到一个文件里,那么必需在措施名前面指定完整的包裹名称,不然不能运行措施。在这种环境下,呼吁行是:
java c03.Assignment
运行位于一个“包裹”里的措施时,随时都要留意这方面的问题。
下面是例子:

 

//: Assignment.java
// Assignment with objects is a bit tricky
package c03;

class Number {
  int i;
}

public class Assignment {
  public static void main(String[] args) {
    Number n1 = new Number();
    Number n2 = new Number();
    n1.i = 9;
    n2.i = 47;
    System.out.println("1: n1.i: " + n1.i +
      ", n2.i: " + n2.i);
    n1 = n2;
    System.out.println("2: n1.i: " + n1.i +
      ", n2.i: " + n2.i);
    n1.i = 27;
    System.out.println("3: n1.i: " + n1.i +
      ", n2.i: " + n2.i);
  }
} ///:~

Number类很是简朴,它的两个实例(n1和n2)是在main()里建设的。每个Number中的i值都赋予了一个差异的值。随后,将n2赋给n1,并且n1产生改变。在很多措施设计语言中,我们都但愿n1和n2任何时候都彼此独立。但由于我们已赋予了一个句柄,所以下面才是真实的输出:
1: n1.i: 9, n2.i: 47
2: n1.i: 47, n2.i: 47
3: n1.i: 27, n2.i: 27
看来改变n1的同时也改变了n2!这是由于无论n1照旧n2都包括了沟通的句柄,它指向沟通的工具(最初的句柄位于n1内部,指向容纳了值9的一个工具。在赋值进程中,谁人句柄实际已经丢失;它的工具会由“垃圾收集器”自动排除)。
这种非凡的现象凡是也叫作“别名”,是Java操纵工具的一种根基方法。但假使不肯意在这种环境下呈现别名,又该怎么操纵呢?可放弃赋值,并写入下述代码:
n1.i = n2.i;
这样便可保存两个独立的工具,而不是将n1和n2绑定到沟通的工具。但您很快就会心识到,这样做会使工具内部的字段处理惩罚产生杂乱,并与尺度的面向工具设计准则相悖。由于这并非一个简朴的话题,所以留待第12章具体阐述,那一章是专门接头别名的。那时,各人也会留意到工具的赋值会发生一些令人震惊的结果。

1. 要领挪用中的别名处理惩罚
将一个工具通报到要领内部时,也会发生别名现象。

 

//: PassObject.java
// Passing objects to methods can be a bit tricky

class Letter {
  char c;
}

public class PassObject {
  static void f(Letter y) {
    y.c = 'z';
  }
  public static void main(String[] args) {
    Letter x = new Letter();
    x.c = 'a';
    System.out.println("1: x.c: " + x.c);
    f(x);
    System.out.println("2: x.c: " + x.c);
  }
} ///:~

#p#分页标题#e#

在很多措施设计语言中,f()要领外貌上好像要在要领的浸染域内建造本身的自变量Letter y的一个副本。但同样地,实际通报的是一个句柄。所以下面这个措施行:
y.c = ‘z’;
实际改变的是f()之外的工具。输出功效如下:
1: x.c: a
2: x.c: z
别名和它的对策长短常巨大的一个问题。尽量必需等至第12章才可得到所有谜底,但以后刻开始就应加以重视,以便提早发明它的缺点。

 

    关键字:

天才代写-代写联系方式