封装并将原语传递给方法

时间:2014-05-12 09:33:03

标签: java encapsulation

我对封装规则和下两个类之间的区别有疑问

class Phone { 
    public String model; 
    double weight; 
    public void setWeight(double w){
        weight = w;
    }
    public double getWeight(){
        return weight;
    }
}

class Home {
    public static void main(String[] args) {
        Phone ph = new Phone();
        ph.setWeight(12.23);
        System.out.println(ph.getWeight());
    }
}

在Java for ICA认证书中,这是封装良好的类的例子 从set和get方法我们可以访问权重变量和pritns 12.23。

但让我困惑的是下一堂课:

class Employee { 
    int age; 
    void modifyVal(int age) {  // even if parameter is d instead age prints the same
        age = age + 1;        // even if parameter is d instead age prints the same
        System.out.println(age); 
    }
}

class Office {
    public static void main(String args[]) { 
        Employee e = new Employee();
        System.out.println(e.age);
        e.modifyVal(e.age);
        System.out.println(e.age);
    }
}

打印: 010

意味着方法modifyVal无法访问年龄变量。有人可以解释为什么变量在应用modufyVal方法后没有变化,有什么区别?

4 个答案:

答案 0 :(得分:2)

modifyVal方法中,age上的操作范围限定为方法的age参数,而不是类实例的this.age

因此this.age不会增加。

答案 1 :(得分:0)

age = age + 1;

必须是

this.age = age + 1;

当实例变量和方法变量具有相同的名称时,您必须告诉java您正在操作哪一个。如果没有this,它将采用方法变量,因此您应该使用this.age

答案 2 :(得分:0)

 void modifyVal(int age) { 
 age = age + 1;            // not modifying age field of Employee class. local age field being passed to the function is being changed.
 System.out.println(age); 
 }


 System.out.println(e.age); // 0 : default value
 e.modifyVal(e.age);         // 1 : as  age = age + 1; i.e, 0+1
 System.out.println(e.age);  // 0 : default value

答案 3 :(得分:0)

这是因为这一行:

age = age + 1; //it's overwriting age parameter and not accessing age instance variable

如果是这样的话,它会修改age实例变量

this.age = age + 1;