我不确定如何说出标题或者这个但是我会尝试尽可能具体。我创建了一个包含构造函数的类,该构造函数允许我创建“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的新手,所以如果我正确使用我的所有术语,我并不是百分之百确定。
答案 0 :(得分:3)
只需制作一个getter方法:
public double getRadius() {
return radius;
}
答案 1 :(得分:1)
最简单(和标准)的方法是在Circle
类中声明一个“getter”方法,即
public double getRadius() {
return radius;
}
或者,您可以使用反射,但它并不意味着用于问题中描述的情况。因此,getter方法就是解决方案。
答案 2 :(得分:1)
最好的方法是在类Circle
中为变量半径创建一个getterpublic 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();
}