-2

我仍然是Java的新手。我的问题可能非常基本。

我有一个类超类Box,

package chapter8;

public class Box {

    double width;
    private double height;
    private double depth;

    Box(double w, double h, double d) {
        width = w;
        height = h;
        depth = d;
    }

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

BoxWeight 是 Box 超类的子类:

package chapter8;

public class BoxWeight extends Box {

    double weight;

    BoxWeight(double w, double h, double d, double m){
        super(w, h, d);
        weight = m;
    }
}

现在我主要在 DemoBoxWeight

package chapter8;

public class DemoBoxWeight {

    public static void main(String[] args) {

        BoxWeight myBox1 = new BoxWeight(2, 3, 4, 5);

        System.out.println("Volume1 :" + myBox1.volume());
        System.out.println("Weight1 :" + myBox1.weight);
        System.out.println("Widht1: " + myBox1.width);
        System.out.println("Depth1: " + myBox1.depth); // as depth is private, it is not accessible
    }
}

由于高度和深度被定义为私有,因此实际传递这些变量的值的 DemoBoxWeight 无法访问它。我知道我可以将 Private 更改为默认/公共,但是还有另一种方法可以让传递值的类实际上可以访问它吗?

PS:因为我是新手,所以我的术语可能是错误的,我的问题真的很愚蠢

4

5 回答 5

5

这样做的通常方法是像这样编写 getter 和 setter:

public double getHeight()
{
    return this.height;
}

public void setHeight(double height)
{
    this.height = height;
}

如果您不希望从类外部更改值,则可以删除 setter。

于 2013-04-28T17:36:38.590 回答
1

基本上,您需要为您的类属性提供访问方法。

有 2 种访问方法 -getters这些是根据Java Bean 定义setters为您的类提供读写访问的标准方法

于 2013-04-28T17:37:43.447 回答
1

这是关于封装的文档(这是您正在处理的):http ://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html 。

于 2013-04-28T17:38:57.307 回答
0

将私有更改为受保护。

protected 修饰符允许类层次结构中的所有子类访问实例变量,而无需使用 getter 或 setter 方法。

它仍然拒绝其他类(在类层次结构之外)访问它,因此仍然考虑封装。

于 2014-09-30T09:46:17.737 回答
0

这主要是通过创建所谓的getters.

public int getHeight(){
  return this.height;
}

这个想法是(而不是公开)将来无论何时您想要更改盒子的内部表示,您都可以这样做而不会根据高度干扰用户。

举例:

假设您要存储对角线而不是深度。或者您可能想要使用浮点数或其他数字类型。

getHeight可能开始看起来像这样:

public int getHeight(){
  return diagonalstoHeight(diagonal1, height, width);
}

现在没有人会了。您还应该阅读encapsulationinformation hiding

于 2013-04-28T17:41:05.243 回答