Java开发之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

陷阱19 痴心妄想——同名形参变量为成员变量赋值

使用Java语言编写的类,通常都是将成员变量定义为私有的,然后通过Getter方法和Setter方法来获取和设置成员变量的值,而且习惯将Setter方法中形参变量的名称设置为与成员变量相同的名称,所以在使用Setter方法为成员变量赋值时,一定要注意区分哪个是类的成员变量,哪个是方法的形参变量,否则将不能正确地为成员变量赋值。

提示

在类中通过方法为成员变量赋值时,如果方法的形参变量或方法体中定义的局部变量与成员变量名称相同,这时方法的形参变量或局部变量将隐藏成员变量,所以在使用时要进行区分,这时可以使用this关键字通过“.”运行符来引用类的成员变量(也就是使用 "this.成员变量”),对于方法的形参变量或局部变量则不需要使用this 关键字,这样就可以区分类的成员变量与方法的形参变量或方法的局部变量了,当然,这也是刚刚走上编程岗位的初级程序员所犯的错误,对于中高级程序员,很少或根本不可能犯这样的错误。

Setter方法为成员变量赋值失败,示例:

在类中定义表示产品数量和产品单价的成员变量,并添加相应的Getter 方法和Setter方法,在Setter方法中为成员变量赋值时,不使用this关键字,然后在主方法中通过Setter方法为成员变量赋值,并计算产品的总金额并输出。

    public class ProductInfo {
      private int number;                             // 定义产品数量
      private int price;                              // 定义产品单价
      public int getNumber () {                        // 产品数量的Getter方法
          return number;
      }
      public void setNumber (int number) {             // 产品数量的Setter方法
          ❶number = number;
      }
      public int getPrice () {                         // 产品单价的Getter方法
          return price;
      }
      public void setPrice (int price) {               // 产品单价的Setter方法
          ❷price = price;
      }
      public static void main (String[] args) {
          ProductInfo prodect = new ProductInfo ();
          prodect. setNumber (60);                 // 调用方法为产品数量成员变量赋值
          prodect. setPrice (4000);                // 调用方法为产品单价成员变量赋值
          // 计算产品的总金额
          int totalMoney = prodect. getNumber () * prodect. getPrice ();
          System. out. println ("产品的总金额是:"+totalMoney);
      }
    }

运行本示例,程序将在控制台输出“产品的总金额是:0”这样的信息,效果如图3.17所示,显然这个结果是错误的。

图3.17 在控制台输出错误的产品总金额

说明

本示例之所以输出“产品的总金额是:0”这样的错误信息,是由于在成员变量的Setter方法中形参变量与成员变量名称相同,而在标记❶处和标记❷处没有使用 "this.成员变量”的方式为成员变量赋值,因而形参变量将类的成员变量隐藏了,所以在标记❶和标记❷处的两条语句中,等号“=”左右的变量都是Setter方法的形参变量,因此没有达到为成员变量赋值的操作,所以最终求产品的总金额时,使用的是两个int型成员变量number和price的默认值0,所以得到错误的结果0。

Setter方法为成员变量赋值成功,示例:

对上一个示例进行更改,使程序能够根据产品数量和单价正确计算出产品的总金额,下面是更改后的代码。

    public class ProductInfo {
      private int number;                             // 定义产品数量
      private int price;                              // 定义产品单价
      public int getNumber () {                        // 产品数量的Getter方法
      return number;
      }
      public void setNumber (int number) {             // 产品数量的Setter方法
      this. number = number;
      }
      public int getPrice () {                         // 产品单价的Getter方法
      return price;
      }
      public void setPrice (int price) {               // 产品单价的Setter方法
      this. price = price;
      }
      public static void main (String[] args) {
      ProductInfo prodect = new ProductInfo ();
      prodect. setNumber (60);                          // 调用方法为产品数量成员变量赋值
      prodect. setPrice (4000);                         // 调用方法为产品单价成员变量赋值
      // 计算产品的总金额
      int totalMoney = prodect. getNumber () * prodect. getPrice ();
      System. out. println ("产品的总金额是:"+totalMoney);
      }
    }

运行本示例,程序输出了正确的结果,效果如图3.18所示。

图3.18 在控制台输出正确的产品总金额

说明

本示例对上一个示例进行了更改,在上一个示例标记❶和标记❷处两条语句的等号“=”左边变量的左侧加上了 "this.”,即本示例中黑体字部分的语句就是修改后的代码,这样,有 "this.”的变量就是类的成员变量,而没有 "this.”的变量就是方法的形参变量,从而区分了成员变量和形参变量,所以程序能够计算出正确的产品总金额。