对于下面这段代码,我试图实现封装。
有疑问,如果我们将类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;
}
}
答案 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;
}
因此,您可以访问私有变量,因为方法定义位于变量
的同一个类中