int //C Pass new PassTest ( // Assign the int 28 // Try to change it 30 pt. changeInt (val)i 31 / What is the current value? System. out. println ("Int value is 34 // Assign the stri str new string 38 //Try t It t. changeStr (str) / What is the current value? System. out str)i 43 / Now set the pt value pt. ptvalue =101.0f; // Now change the value of the float // th pt. changeob] Value (pt)i / What is the current value?
90 19 20 String str; 21 int val; 22 23 // Create an instance of the class 24 25 PassTest pt = new PassTest (); 26 // Assign the int 27 val = 11; 28 29 // Try to change it 30 pt.changeInt (val); 31 32 // What is the current value? 33 System.out.println ( " Int value is: " + val); 34 35 // Assign the string 36 str = new String ( " hello " ); 37 38 // Try to change it 39 pt.changeStr (str); 40 41 // What is the current value? 42 System.out.println ( " Str value is: " + str); 43 44 // Now set the ptValue 45 pt.ptValue = 101.0f; 46 47 48 // Now change the value of the float 49 // through the object reference 50 pt.changeObjValue (pt); 51 52 // What is the current value?
System. out. println ("Current ptvalue is:+ pt. ptvalue)i 这个代码输出如下内容: c: \student \source \ java PassTest Int value is: 11 Str value is: hello Current ptva lue is: 99.0 字符串对象是不会被 changer(改变的,但是, Pass Test对象的内容被改变了。 535this引用 s引用 public class Myl private int day, month, yeari public void tomor row()i this day this day li wrap around code 关键字this是用来指向当前对象或类实例的。这里, this day指的是当前对象的day字段 ublic class MyDate t private int day, month, yeari public void tomor row ()i this day this day 1 // wrap around code Java编程语言自动将所有实例变量和方法引用与his关键字联系在一起,因此,使用关键字在某些情况下是多余的。 下面的代码与前面的代码是等同的。 public class MyDate t private int day, month,year public void tomor row()( day day 1;// no this. before day // wrap around code 也有关键字ths使用不多余的情况。如,需要在某些完全分离的类中调用一个方法并将当前对象的一个引用作为参数传
91 53 System.out.println ( " Current ptValue is: " + 54 pt.ptValue); 55 } 56 } 这个代码输出如下内容: c:\student\source\> java PassTest Int value is: 11 Str value is: hello Current ptValue is: 99.0 字符串对象是不会被 changeStr()改变的,但是,PassTest 对象的内容被改变了。 5.3.5 this 引用 this 引用 public class MyDate { private int day, month, year; public void tomorrow() { this.day = this.day + 1; // wrap around code... } } 关键字 this 是用来指向当前对象或类实例的。这里,this.day 指的是当前对象的 day 字段。 public class MyDate { private int day, month, year; public void tomorrow() { this.day = this.day + 1; // wrap around code... } } Java 编程语言自动将所有实例变量和方法引用与 this 关键字联系在一起,因此,使用关键字在某些情况下是多余的。 下面的代码与前面的代码是等同的。 public class MyDate { private int day, month, year; public void tomorrow() { day = day + 1; // no ` this. ' before ` day ' // wrap around code... } } 也有关键字 this 使用不多余的情况。如,需要在某些完全分离的类中调用一个方法并将当前对象的一个引用作为参数传
递时。例如 Birthday bDay new Birthday (this) 5.3.6数据隐藏 pubic void tomorrow()i this da ublic class DateUser t public static void main(String args[])t Date my date new My Date ()i Mydate. day 21;//i11ega1 在 My Date类的day, month,year声明中使用关键字 private,使从除了在 My Date类本身的方法以外的任何代码中访问 这些成员成为不可能。因此,给 My Date类指定一个声明,下述代码是非法的 public class DateUser t public static void main(String args[])( My Date d= new My d day 21; //illegal! 防止直接访问数据变量看起来奇怪,但它实际上对使用 MyDate类的程序的质量有极大的好处。既然数据的单个项是 不可访问的,那么唯一的办法就是通过方法来读或写。因此,如果要求类成员的内部一致性,就可以通过类本身的方法 来处理。 思考一下允许从外部对其成员进行自由访问的 MyDate类。代码做如下工作将是非常容易的 MyDate d= new My Date () d day = 32: / invalid day d. month= d day = 30: / plausible but wrong d month d month l; // omit check for wrap round 警告一这些和其它类似的赋值导致了在 My Date对象字段中无效的或不一致的值。这种情形是不可能马上作为问题暴露出 来的,但肯定会在某个阶段终止程序 如果类的数据成员没有暴露(被封装在类里),那么,类的用户会被迫使用方法来修改成员变量。这些方法能进行有 效性检查。考虑将下述方法作为 MyDate类的一个部分 ublic void setDay (int targetDay)(
92 递时。例如: Birthday bDay = new Birthday (this); 5.3.6 数据隐藏 数据隐藏 public class Date { private int day, month, year; pubic void tomorrow(){ this.day = this.day +1; // wrap around code… } } public class DateUser { public static void main(String args[]) { Date mydate = new MyDate (); Mydate.day = 21; //illegal! } } 在 MyDate 类的 day,month,year 声明中使用关键字 private,使从除了在 MyDate 类本身的方法以外的任何代码中访问 这些成员成为不可能。因此,给 MyDate 类指定一个声明,下述代码是非法的: public class DateUser { public static void main(String args[]) { MyDate d = new MyDate (); d.day = 21; // illegal! } } 防止直接访问数据变量看起来奇怪,但它实际上对使用 MyDate 类的程序的质量有极大的好处。既然数据的单个项是 不可访问的,那么唯一的办法就是通过方法来读或写。因此,如果要求类成员的内部一致性,就可以通过类本身的方法 来处理。 思考一下允许从外部对其成员进行自由访问的 MyDate 类。代码做如下工作将是非常容易的: MyDate d = new MyDate (); d.day = 32; // invalid day d.month = 2; d.day = 30; // plausible but wrong d.month = d.month + 1; // omit check for wrap round 警告—这些和其它类似的赋值导致了在 MyDate 对象字段中无效的或不一致的值。这种情形是不可能马上作为问题暴露出 来的,但肯定会在某个阶段终止程序。 如果类的数据成员没有暴露(被封装在类里),那么,类的用户会被迫使用方法来修改成员变量。这些方法能进行有 效性检查。考虑将下述方法作为 MyDate 类的一个部分。 public void setDay(int targetDay) {
f (targetDay this days InMonth()) System. err println( invalid day "t targetDay) else i this day target Day. 方法检查就是要看所要求设定的日期是否有效。如果日期无效,方法忽略了请求并打印出了信息。后面将会看到Java编 程语言提供一个更有效的机制来处理溢出的方法参数。但现在,你可以看到Date类对无效日期是受到有效保护的。 -在上例中, days In Month0被指定为Date类中的一个方法。因此,它有一个this值,从这个值上,它可以提取回 所要求的 month和year。由于与成员变量一起使用, daysInMonthO方法的this的使用就多余了。 关于如何正确地调用方法,诸如“参数“月份”的值在对象中必须在有效范围内”的规则被叫做不变量(或前置和后 置条件)。谨慎使用前置条件测试,可使类更容易再次使用,而且在重用中更可靠,因为如果任何方法被误用,使用该类 的程序员能马上发现 537封装 封装 隐藏类的实现细节 迫使用户去使用一个界面去访问数据 使代码更好维护 除了保护对象的数据不被误修改外,在确保所要求的副作用被正确处理的情况下,迫使用户通过方法访问数据能使 类的重用变得更简单。比如,在 My Date类的情形之下,考虑如何构造 tomorrow方法 如果数据完全可以访问,那么类的每一个用户都需要增加day的值,测试当前月份的天数,并处理月终(而且可能 是年终)情形。这就毫无意义而且容易出错。仅管这些要求对日期来说是很好理解的,其它数据类型可能具有鲜为人知 的相似的限制。通过迫使类的用户去使用所提供的 tomorrow方法,保证每个人每次都能连续地并且正确地处理必要的副 作用 数据隐藏通常指的就是封装。它将类的外部界面与类的实现区分开来,隐藏实现细节。迫使用户去使用外部界面, 即使实现细节改变,还可通过界面承担其功能而保留原样,确保调用它的代码还继续工作。这使代码维护更简单。 第四节重载方法名称 重载方法名称 它可如下所示使用: public void println(int 1) public void println(float f) public void println( 参数表必须不同 返回类型可以不同
93 if (targetDay > this.daysInMonth()) { System.err.println( " invalid day " + targetDay); } else { this.day = targetDay; } } 方法检查就是要看所要求设定的日期是否有效。如果日期无效,方法忽略了请求并打印出了信息。后面将会看到 Java 编 程语言提供一个更有效的机制来处理溢出的方法参数。 但现在,你可以看到 Date 类对无效日期是受到有效保护的。 注—在上例中,daysInMonth()被指定为 Date 类中的一个方法。因此,它有一个 this 值,从这个值上,它可以提取回答 询问所要求的 month 和 year。由于与成员变量一起使用,daysInMonth()方法的 this 的使用就多余了。 关于如何正确地调用方法,诸如“参数“月份”的值在对象中必须在有效范围内”的规则被叫做不变量(或前置和后 置条件)。谨慎使用前置条件测试,可使类更容易再次使用,而且在重用中更可靠,因为如果任何方法被误用,使用该类 的程序员能马上发现。 5.3.7 封装 封装 隐藏类的实现细节 迫使用户去使用一个界面去访问数据 使代码更好维护 除了保护对象的数据不被误修改外,在确保所要求的副作用被正确处理的情况下,迫使用户通过方法访问数据能使 类的重用变得更简单。比如,在 MyDate 类的情形之下,考虑如何构造 tomorrow()方法。 如果数据完全可以访问,那么类的每一个用户都需要增加 day 的值,测试当前月份的天数,并处理月终(而且可能 是年终)情形。这就毫无意义而且容易出错。仅管这些要求对日期来说是很好理解的,其它数据类型可能具有鲜为人知 的相似的限制。通过迫使类的用户去使用所提供的 tomorrow()方法,保证每个人每次都能连续地并且正确地处理必要的副 作用。 数据隐藏通常指的就是封装。它将类的外部界面与类的实现区分开来,隐藏实现细节。迫使用户去使用外部界面, 即使实现细节改变,还可通过界面承担其功能而保留原样,确保调用它的代码还继续工作。这使代码维护更简单。 第四节 重载方法名称 重载方法名称 它可如下所示使用: public void println(int i) public void println(float f) public void println() 参数表必须不同 返回类型可以不同