我们如何使用getter和setter访问私有实例变量?

时间:2014-07-09 10:47:55

标签: java

对于下面这段代码,我试图实现封装。

有疑问,如果我们将类dog的实例变量设为私有,我们如何能够在name方法中返回实例变量getName?根据我的理解,我们无法访问创建它的类之外的私有实例变量。

有人可以解释我们如何能够访问name实例变量的值吗?

测试方法:

public class TestEncapsulationOld{

    public static void main (String [] args) {

    Dog d = new Dog();

    d.setAge(5);
    d.setName("tuffy");

    System.out.println (d.getName()+"'s age is "+d.getAge());   
    }
}

班级Dog

class Dog {

    private int age;
    private String name;
    public void setName (String n) {
        name = n;   
    }

    public String getName() {
        return name;
    }

    public void setAge (int a) {

        if (a <= 0){
            System.out.println ("Invalid age!!");
        }

        else if (a>20){
            System.out.println ("A dog cant live that long");
        }

        else{
        age = a;
        }
    }

    public int getAge() {
        return age;
    }
}

4 个答案:

答案 0 :(得分:1)

name字段是私有的,意味着您无法在Dog类之外使用:

Dog d = new Dog();
System.out.println(d.name); // Won't compile as name is private.

但是,getName()方法是公开的,因此可以在任何地方使用。在getName()内,您可以访问name字段,因为它位于同一个类中。

答案 1 :(得分:1)

虽然变量本身在类中具有私有访问权限,但是setter / getter是公共的,因此可以从任何地方访问。 这意味着您可以调用该方法,该方法已经在类中,因此该方法可以访问变量本身。

这些的一个非常常见的用途是,例如,您想要一些只能从外部读取的实例变量,即。只有一个吸气剂。例如,当你以某种方式生成值,或者在构造函数中将它们带入并且不希望它们可以从外部修改时,这可能是你想要的。

一个例子:

public class User{
 private String name;
 private String pass;

 public User(String _name, String _pass){
   name = _name;
   pass = mySuperCoolHashingFunction(_pass);
 }

 private String mySuperCoolHashingFunction(String pass){
   //do some stuff with the pass here
 }

 public void setPass(String newPass){
   pass = mySuperCoolHashingFunction(newPass);
 }

 //other code, getters, setters, etc...
}

在这种情况下,没有人可以直接触摸传递变量,如果你想让他们看到哈希密码,你可以有一个getter,但是当他们使用setter时,他们实际上并没有直接设置值,但它去了通过其他一些变化。

很抱歉答案很长,只是尽量清楚并提供某种形式的例子,希望有所帮助:)

答案 2 :(得分:0)

是的,使用private访问修饰符会阻止您直接访问属性,但使用public getter方法,检索类中的属性,然后返回你的结果。

直接访问示例:

Dog d = new Dog();
String dogName = d.name;

答案 3 :(得分:0)

getter方法是public

public String getName() {
    return name;
}

因此,您可以访问私有变量,因为方法定义位于变量

的同一个类中