私有变量初始化

时间:2013-04-29 19:17:37

标签: java

我运行了以下代码:

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

7 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

一切都很好,你可以设置这个值(通过构造函数)只有ONCE - 在构造对象上。在此之后,您的变量是安全的,没有人可以更改值。

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 允许其他人在创建时间后修改值。没有这个,你的领域是安全的。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

Box类范围内的任何代码都可以修改和/或读取private类范围内声明为Box的变量。事实上,这就是吸气剂和制定者的工作方式;它们属于类和访问private变量的范围。

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

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

答案 4 :(得分:0)

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

答案 5 :(得分: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

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

答案 6 :(得分:0)

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