可以在java中理解setter和getter

时间:2011-12-30 21:47:30

标签: java class setter getter

我是java的新手,但我喜欢这种语言,我希望自己变得尽可能好,但我对“课堂”的事情仍然有些困难。 我理解一个类是什么,有什么对象,但我仍然无法理解好的getter和setter

我知道班级有

  • 实例变量
  • 构造
  • 方法
  • 塞特犬和吸气剂?

我无法理解为什么我需要它们,如果我应该在构造函数中编写它们。

还要指出我已经阅读了几篇互联网文章,但

  1. 那些是“技术性的”
  2. 他们只是编写一个没有实例变量的代码,构造函数让我无法理解
  3. 即使您是像我这样的初学者,也非常感谢您的帮助^^

    修改

    例如我应该如何在这里使用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");
        } 
    }
    

5 个答案:

答案 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规范定义。