文章标题

关于对象的思考

1.不可变对象和类
通常,创建一个对象后,它的内容是允许随后改变的。有时候,也需要创建一个一旦创建,其内容就不能再改变的对象。我们称这种对象为一个不可变对象(immutable object),而它的类就称为不可变类(immuutable class)。例如:
String类就是不可变的。
如果一个类是不可变的,那么它的所有数据域必须都是私有的,而且没有任何一个数据域提供公共的set方法。一个类的所有数据都是私有的且没有修改器,并不意味着它一定是不可变类,例如:下面的类,它的所有数据域都是私有的,而且也没有set方法,但它不是一个不可变的类。

public class Student{
   private int id;
   private String name;
   private Date dateCreated;
   public Student (int ssn,String newName){
       id = ssn;
       name = newName;
       dateCreated = new Date();
   }
   public int getId(){
   return id;
   }
   public String getName(){
     return name;
   }
   public Date getDateCreated(){
   return dateCreated;
}
}

如下面的代码所示,使用getDateCreated()方法返回数据域dateCreated。它是对Date对象的一个引用。通过这个引用,可以改变dateCreated的值。

public class Test {
   public static void main(String[] args) {
   Student student = new Student(111223333,"John");
   Date dateCreated = student.getDateCreated();
   dateCreated.setTime(200000);

}

要使一个类成为不可变的,它必须满足下面的需求:
所有数据域都是私有的。
没有修改器方法。
没有一个访问器方法,他会返回一个指向一个可变数据域的引用。
变量的作用域
一个类的实例变量和静态变量称为类变量(class’s variables)或数据域(data field)。在方法内部定义的变量称为局部变量。不管在何处声明,类变量的作用域都是整个类。类的变量和方法可以在类中以任意顺序出现,当一个数据域是基于对另一个数据域的引用来进行初始化的情况除外。在这种情况下,必须首先声明另一个数据域。
类变量只能声明一次,但是在一个方法内不同的非嵌套块中,可以多次声明相同的变量名。
如果一个局部变量和一个类变量具有相同的名字,那么局部变量优先,而同名的类变量将被隐藏,例如:在下面的程序中,x被定义为一个实例变量,也在方法中被定义为局部变量。
public class Foo{
private int x = 0; // Instance variable
private int y = 0;
public Foo( ){
}
public void p(){
int x = 1; //Local variable
System.out.println(“x = ” +x);
System.out.println(“y = ” + y);
}
}
假设f是Foo的一个实例,那么f.p()的打印输出是什么呢?f.p()的打印输出是:x为1,y为0。其原因如下:
x被声明为类中初值为0的数据域,但是他在方法p()中又被声明了一次,初值为1。System.out.println语句中引用的x是后者。
y在方法p()的外部声明,但在内部也是可访问的。
提示 为避免混淆和错误,除了方法中的参数,不要讲实例变量或静态变量的名字作为局部变量名。
this的引用
关键字this是指向调用对象本身的引用名。一种常见的用法就是引用类的隐藏数据域(hidden data field)。例如:在数据域的set方法中,经常将数据域名用作参数名。在这种情况下,这个数据域在set方法中被隐藏。为了给他设置新值,需要在方法中引用隐藏的数据域名。隐藏的静态变量可以简单的通过“类名.静态变量”的方式引用。隐藏的实例变量就需要使用关键字this来引用。

public class Foo {
int i = S;
static  double k = 0;
void setI(int i){
   this.i = i;
}
static void setK(double k ){
   Foo.k = k;
}
}

关键字this给出一种指代对象的方法,这样在实例方法代码中调用实例方法。this.i = i 这一行的意思是”将参数i的值赋给调用对象的数据域i”。 关键字this是指调用实例方法setI的对象,Foo.k =k这一行的意思是将参数k的值赋给这个类的静态数据域k,k是被类的所有对象所共享的。
关键字this的另一个常用方法是让构造方法调用同一个类的另一个构造方法。例如

public class Circle {
private double radius;
public Circle(double radius) {
this.radius = radius ;
}
public Circle(){
this(1.0);
}
public double getArea() {
  return this.radius * this.radius *Mathi.PI;
}
}

在第二个构造方法中,this(1.0)这一行调用带double值参数的第一个构造方法。
提示 如果一个类有多个构造方法,最好尽可能使用 this(参数表)实现它们。通常,无参数或参数少的构造方法可以用this(参数表)调用参数多的构造方法。这样通常可以简化代码,使类易于阅读和维护。

注意 Java要求在构造方法中,语句this(参数列表)应在任何其他语句之前出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值