我是java的新手,但我喜欢这种语言,我希望自己变得尽可能好,但我对“课堂”的事情仍然有些困难。 我理解一个类是什么,有什么对象,但我仍然无法理解好的getter和setter
我知道班级有
我无法理解为什么我需要它们,如果我应该在构造函数中编写它们。
还要指出我已经阅读了几篇互联网文章,但
即使您是像我这样的初学者,也非常感谢您的帮助^^
修改
例如我应该如何在这里使用setter和getter?
class Demo {
int a=4;
Int b;
public Demo () {
System.println("a is <than b")
};
public int Demo (int b) {
if (a<b)
System.out.println("a is < than b");
else
System.out.println("b is < than a");
}
}
答案 0 :(得分:6)
您需要它们以允许您的类的用户获取和设置参数。这样,您的班级就可以跟踪参数的设置时间,例如检查约束,强制执行一致性,更新其他值,使缓存无效。封装还允许您在保持API兼容的同时修改版本之间的类的内部表示。
答案 1 :(得分:6)
你问了一个简单的例子,所以我会给一个。假设你正在设计一个圆圈类。圆的特征在于其直径:
public class Circle {
private double diameter;
public Circle(double diameter) {
this.diameter = diameter;
}
}
来电者可能想知道圆的直径,因此您需要添加一个getter:
public class Circle {
private double diameter;
public Circle(double diameter) {
this.diameter = diameter;
}
public double getDiameter() {
return this.diameter;
}
}
您可能还想获得圆圈的区域,因此您为该区域添加了一个吸气剂:
public double getArea() {
return Math.PI * (this.diameter / 2) * (this.diameter / 2);
}
然后您意识到使用半径而不是直径对于圆的内部方法更容易。但是你希望保持你班级的所有用户不变,以避免破坏现有的许多代码。因此,您无需更改界面即可更改类的内部:
public class Circle {
private double radius;
public Circle(double diameter) {
this.radius = diameter / 2;
}
public double getArea() {
return Math. PI * radius * radius;
}
public double getDiameter() {
return this.radius * 2;
}
}
最后,您想要更改圆的直径,因此您需要添加一个setter:
public void setDiameter(double diameter) {
this.radius = diameter / 2;
}
但是等一下,直径为负的圆圈毫无意义,所以你让方法更安全:
public void setDiameter(double diameter) {
if (diameter <= 0) {
throw new IllegalArgumentException("diameter must be > 0");
}
this.radius = diameter / 2;
}
如果您在施工时预先计算了该区域,则setDiameter也必须更改该区域的值:
public class Circle {
private double radius;
private double area;
public Circle(double diameter) {
this.radius = diameter / 2;
this.area = Math. PI * radius * radius;
}
public double getArea() {
return area;
}
public double getDiameter() {
return this.radius / 2;
}
public void setDiameter(double diameter) {
this.radius = diameter / 2;
// the area must also be changed, else the invariants are broken.
this.area = Math. PI * radius * radius;
}
}
吸气剂和制定者只是方法。但是它们遵循命名约定,使您的代码易于掌握,并且可以被许多依赖于这些约定的框架使用。
答案 2 :(得分:3)
getter或setter只是一个返回类属性或设置类属性的函数。您使用它们的原因是因为通常将类属性定义为private
,这意味着您只能在类方法中直接引用它们。
getter是一个public
方法(意思是它可以从类本身外部调用),它返回一个私有值。这允许该属性保持私有,但仍可在课堂外访问。
setter是一个设置私有值的public
方法。正如您可能已经猜到的那样,这允许该属性保持私有,但仍然可以设置在该类之外。
答案 3 :(得分:2)
Setter和getter只是用于访问与类关联的字段的方法:
class Demo {
int a;
public Demo () { a=4; }
public int getDemo () { return a; }
public void setDemo (int a) { this.a=a; }
}
答案 4 :(得分:0)
getter和setter是一种访问与类关联的Java Bean属性的方法。它只是能够访问该类有兴趣共享的公共字段的标准方法。它们由Java Bean规范定义。