2013-04-29 147 views
0

我跑到下面的代码:私有变量初始化

public class Box { 

    private int length = 1; 
    private int width = 2; 
    private int height = 3; 

    Box(int l, int w, int h) { 
      length = l; 
      width = w; 
      height = h; 
     } 

     double volume() { 
      return length * width * height; 
     } 

} 

public class DemoBox { 

    public static void main(String[] args) { 

     Box box1 = new Box(3, 3, 3); 
     System.out.println("Volumne: " +box1.volume()); 
    } 
} 

我一直以为我将无法修改私有变量的值,而无需的getter/setter。但在上面的代码中,我能够将值传递给私有变量,结果体积为27(3 * 3 * 3)。这是预期的行为,并请解释我失去了我在私人变数和getter/setter

+1

回去再读一下私人变量。你可以在他们声明的类中访问它们。 'volume()'是'Box'的一个实例方法,因此可以访问它们。 – 2013-04-29 19:19:12

+0

您只能像这样分配私有变量。获取者/设置者通常由于访问其他类而被定义为public。 – 2013-04-29 19:21:27

回答

1

的理解你没有直接传递它们。你在构造函数中传递了它们,这是预期的行为。请注意,这些值在构造函数的代码中进行了更改,该构造函数包含在声明这些专用字段的类中。

尝试在DemoBox类中执行box1.length = 10并查看编译器所说的内容。

0

类别Box范围内的任何代码都可以修改和/或读取Box类范围内声明为private的变量。事实上,这就是吸气人员和安装人员的工作方式;他们处于该类的范围内并且访问变量private

当你说在DemoBoxBox box1 = new Box(3, 3, 3);DemoBox代码没有修改的变量中,Box构造一样,而Box构造函数是类的范围之内,因此它可以访问private变量。

DemoBox中的代码不能直接修改Box中的私有变量; Box中的任何public方法将允许DemoBox通过在Box类的范围内的方法代码间接修改它们。

1

一切都很好,你可以设置这个值这种方式(由构造)只有一次 - 构建对象。在此之后,变量是安全的,没有人可以改变值。

Box不是对象,这是类定义!

public class Box { 
... 
} 

box1为对象,施工后没有办法去改变它(没有魔法):)

Box box1 = new Box(3, 3, 3); 

如果你想方法value()的结果是8,那么你必须定义另一个对象:

Box box2 = new Box(2, 2, 2); 

此后box2.value() == 8

没有办法使box1.value() == 8(没有一些魔术)。

但是你可以为最终宣告字段保护申报值

private final int length = 1; 
private final int width = 2; 
private final int height = 3; 

在这之后,你不能改变自己的价值观,即使在构造 - 发生编译失败。

Getter赋予其他人创建时间后读取值的权限。 设置者赋予其他人创建时间后修改值的权限。没有这个你的领域是安全的。

1

私有变量可以由类内部修改,如果它们不是最终的。在你的情况下,你的类的构造函数正在覆盖你的默认值。这是有效和普遍的。

0

是的,这是预期的行为。您正在修改这些变量,但是在它们所属的类的内部,按照它在类中描述的方式。你不能做的是获得像box1.length这样的变量或者设置其值如box1.length = 5。就像Box是唯一一个可以最终决定是否可以获得变量值或设置变量值的方法。你可以从外部设置长度值,因为Box“想要它”,因为你在Box构造函数中允许它(或者在另一种方法中,它将是相同的情况)。

0

当你实例化你的成员变量,如

private int length = 1; 
private int width = 2; 
private int height = 3; 

你只是提供可以通过构造函数传递不同的值来覆盖默认值。

Box box1 = new Box(3, 3, 3); 

但是,那么这是有道理的,你还需要提供一个默认构造函数。

Box() {} 

没有默认构造有一个在你的成员变量提供默认值,因为他们总是会被你的参数的构造函数覆盖是没有意义的。

Box defaultBox = new Box(); 
System.out.println("Volumne: " + box1.volume()); // prints 6; default volume 

现在,您可以修改私有变量的原因是您在构造函数中这样做了;一个特殊的类构造,用于初始化正在构建的对象的状态。私人访问修饰符在这里不适用,因为您要保护私人需要首先构建!

0

私有变量可以在它们被定义的类中修改。除了定义变量的类以外,我们不能在没有setter的情况下修改私有变量。