1.2.4 如何访问对象成员

每次创建一个类的实例时,就创建了一个对象,这个对象包含由类定义的属性和方法。使用点(.)运算符来访问(使用)该对象中的属性和方法,例如,要给rect的width变量赋值为10,应使用下面的语句:

            Rectangle rect=new Rectangle();    // 定义类的对象rect
            rect.width=10;    // 访问对象rect的数据成员width并赋值10

该语句告诉编译器将包含在rect对象内的width属性赋值为10。当然也可以如此访问对象中的方法。

访问对象成员的一般形式为:

对象名.成员变量名

对象名.成员方法名(参数列表)

例1-2】 利用【例1-1】定义的圆形类Round,计算半径为10的一个具体圆的周长。

            public static void main (String args[]){
                Round  r=new Round();       // 声明并实例化圆形对象r
                r.radius=10;               // 访问成员变量并赋值
              double p=r.perimeter();   // 调用成员方法求周长
              System.out.println("半径"+r.radius+"的圆的周长是:"+p);
          }

结果:

            半径10.0的圆的周长是:62.8

同一个类的对象虽然都有相同的属性和方法,但其属性和方法对于每个对象都是独立的。这意味着如果有两个Rectangle对象,则每个对象都有自己的width和length的副本。其表现是改变一个对象的实例变量是不会影响另一个实例变量的。正如张三和李四都是“人”类的具体对象,但对张三做的事是不会让李四发生任何变化的。

例1-3】 利用【例1-1】中定义的圆形类Round,生成半径为20、10的两个对象,并计算每个对象的周长。

            public static void main(String args[]){
                Round r1=new Round();   // 声明并实例化Round对象r1
                Round r2=new Round();   // 声明并实例化Round对象r2
                                    // 给每个对象的半径属性赋值
                r1.radius = 10;
                r2.radius = 20;
                                    // 调用r1中perimeter()方法得到第一个圆r1的周长并打印输出
                System.out.println("半径"+r1.radius+"的圆的周长是:"+r1.perimeter());
                                    // 调用r2中perimeter()方法得到第二个圆r2的周长并打印输出
                System.out.println("半径"+r2.radius+"的圆的周长是:"+r2.perimeter());
            }

结果:

            半径10.0的圆的周长是:62.8
            半径20.0的圆的周长是:125.6

可以看到,两个由同一个Round类生成的对象中的数据完全分离,二者互不相干。

再看如下代码,在内存空间中有几个Rectangle对象?

            Rectangle rect1=new Rectangle();   // 声明对象rect1并实例化
            Rectangle rect2=  rect1;          // 声明对象rect2,并将rect1赋值给rect2

你可能认为rect1和rect2是不同的对象,但这是错误的。实际上,执行完这段代码后,rect1和rect2将引用同一个对象。将rect1赋值给rect2并不会分配任何内存也就是不能创建一个新的对象,而只是让rect2指向rect1所指向的对象。因此,rect2为对象所做的任何改变将对rect1所指向的对象产生影响,因为它们是同一个对象。(如图1-3所示。)

图1-3 变量rect1和变量rect2引用同一个对象

特别提示:

当把一个指向对象的引用变量赋给另一个对象引用变量时,并没有创建该对象的副本,而只是创建该引用的一个副本。

工作分解-操作方案

1.定义主类;

2.用1.2.3节生成的Rectangle类创建类对象;

3.给对象属性赋值;

4.调用对象方法完成具体功能,获得周长和面积。

工作实施

1.定义主类(包含了main方法的类)

        public class RectangleTest{
            public static void main(String  args[]){// 主方法
            }
        }

2.创建类的对象

        Rectangle rect=new Rectangle();        // 声明并实例化对象rect

3.访问对象,给对象属性赋值,并调用方法

        // 向成员变量赋值
rect.length = 10.0;
rect.width = 5.0;
        // 打印出指定长方形的长、宽、周长和面积
System.out.println("长方形的长:"+rect.length+"\t宽:"+rect.width);
System.out.println("这个长方形的周长是:"+rect.perimeter());
System.out.println("这个长方形的面积是:"+rect.area());

4.代码调试运行

        长方形的长:10.0   宽:5.0
        这个长方形的周长是:30.0
        这个长方形的面积是:50.0