声明私有实例变量并在不同的类中引用它

时间:2014-02-25 01:17:56

标签: java

我不确定如何说出标题或者这个但是我会尝试尽可能具体。我创建了一个包含构造函数的类,该构造函数允许我创建“Circle”类型的对象,并且该圆圈具有参数radius。这是班级:

public class Circle {
    private double radius;

    public Circle(double radius) {
        this.radius = radius; // this.radius refers to the instance variable above
    }

    public Circle() {
    }

    public double getArea() {
        double area = radius * radius * Math.PI;
        return area;
    }

    public double getCircumference() {
        double circumference = 2 * Math.PI * radius; 
        return circumference;
    }
}

我认为此代码中包含的方法很简单。我创建一个给定半径的对象,它计算周长和面积。

我还有另一个类CircleTester,我在其中创建了2个Circle类型的对象,c1和c2,半径分别为5和10。

public class CircleTester {
    public static void main (String[] args) {
        Circle c1 = new Circle(5);
        double circumference1 = c1.getCircumference(); 
        double area1 = c1.getArea();
        System.out.println("Radius of c1: " + c1.radius);
        System.out.printf("The circle c1 with circumference %.3f has area %.3f%n", circumference1, area1);

        Circle c2 = new Circle(10); 
        double area2 = c2.getArea(); //objectReference.methodName()
        double circumference2 = c2.getCircumference(); //objectReference.methodName()
        System.out.println("Radius of c2: " + c2.radius);
        System.out.printf("The circle c2 with circumference %.3f has area %.3f%n", circumference2, area2);
    }
}

我遇到以下两行错误:

System.out.println("Radius of c2: " + c2.radius);

System.out.println("Radius of c2: " + c2.radius);

程序无法识别c2.radius,因为实例变量“radius”在circle类中声明为private。

我的问题是有没有办法允许CircleTester程序读取每个对象半径的值,而不将实例变量从私有变为公用? c1.radius和c2.radius不起作用 - 错误是“Circle.radius不可见”(因为它是私有的)**

我不想公开的原因是因为我的导师告诉我,将一个实例变量声明为公共可以被视为糟糕的编程,我们可能会在考试中受到惩罚。

我很抱歉,如果这是模糊或愚蠢的 - 解释从来都不是我的强项。我也是Java的新手,所以如果我正确使用我的所有术语,我并不是百分之百确定。

6 个答案:

答案 0 :(得分:3)

只需制作一个getter方法:

public double getRadius() {
  return radius;
}

答案 1 :(得分:1)

最简单(和标准)的方法是在Circle类中声明一个“getter”方法,即

public double getRadius() {
    return radius;
}

或者,您可以使用反射,但它并不意味着用于问题中描述的情况。因此,getter方法就是解决方案。

答案 2 :(得分:1)

最好的方法是在类Circle

中为变量半径创建一个getter
public double getRadius(){
     return radius;
}

并使用

System.out.println("Radius of c2: " + c2.getRadius());

答案 3 :(得分:0)

只需使用getter获取变量:

public double getRadius() {
    return radius;
}

这实际上是一种很好的编程习惯。如果你想改变这个值,你可以类似地做一个setter。

答案 4 :(得分:0)

定义对象时,请考虑您可能想要询问的所有对象。例如,对于圆形物体,您可能需要询问面积,半径,直径,周长......所以

不要引诱直接暴露对象的内部参数。

public class Circle {
    private double radius;

    public Circle(Double radius) { this.radius = radius;}

    public double getArea() { return radius*radius*Math.PI; }
    public double getRadius() { return radius;}
    public double getDiameter() { return 2*radius;}
    public double getCircumference() { return Math.PI*getDiameter();}
}

答案 5 :(得分:0)

虽然getter方法是最好的方法,但这是一种使用反射的方法。除非您希望Circle对象实际上是不可变的,否则我不建议使用它。

Circle circle = new Circle(10.0);

Field radius;
try {
    radius = circle.getClass().getDeclaredField("radius");
    radius.setAccessible(true); // required since field is private
    System.out.println(radius.getDouble(circle));
    radius.setAccessible(false);
} catch (NoSuchFieldException | IllegalAccessException e) {
    e.printStackTrace();
}
相关问题