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的理解中缺少的地方

4

7 回答 7

1

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

尝试box1.length = 10DemoBox课堂上做,看看你的编译器说什么。

于 2013-04-29T19:19:35.593 回答
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(没有一些魔法)。

但是您可以将字段声明为 final 以保护声明的值

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

在此之后,即使在构造函数中您也无法修改他的值 - 发生编译失败。

Getter允许其他人在创建时间后读取值。Setter授予其他人在创建时间后修改值的权限。没有这个,你的领域是安全的。

于 2013-04-29T19:21:07.070 回答
1

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

于 2013-04-29T19:21:56.063 回答
0

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

于 2013-04-29T19:25:14.087 回答
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

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

于 2013-04-29T19:26:19.353 回答
0

私有变量可以在定义它们的类中进行修改。除了定义变量的类之外,我们无法在没有 setter 的情况下修改私有变量。

于 2013-04-30T04:43:41.633 回答
0

类范围内的任何代码都可以修改和/或读取在类范围内Box声明的变量。事实上,这就是 getter 和 setter 的工作方式。它们在类和访问变量的范围内。privateBoxprivate

当你说Box box1 = new Box(3, 3, 3);inDemoBox时,DemoBox代码没有修改变量,Box构造函数做了,并且Box构造函数在类的范围内,所以它可以访问private变量。

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

于 2013-04-29T19:19:43.913 回答