繁体   English   中英

可以在java中理解setter和getter

[英]Can understand setters and getters in java

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

我知道上课了

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

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

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

  1. 那些是“技术性的”
  2. 他们只是编写一个没有实例变量的代码,构造函数让我无法理解

即使您是像我这样的初学者,也非常感谢您的帮助^^

编辑:

例如,我应该如何在这里使用setter和getters?

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");
    } 
}

您需要它们以允许您的类的用户获取和设置参数。 这允许您的类跟踪何时设置参数,例如检查约束,强制一致性,更新其他值,使缓存无效。 封装还允许您在保持API兼容的同时修改版本之间的类的内部表示。

你问了一个简单的例子,所以我会给一个。 假设你正在设计一个圆圈类。 圆的特征在于其直径:

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;
    }
}

您可能还想获得圆的区域,因此您为该区域添加了一个getter:

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;
    }
}

吸气剂和制定者只是方法。 但是它们遵循一种命名约定,使您的代码易于掌握,并且可以被许多依赖于这些约定的框架使用。

getter或setter只是一个返回类属性或设置类属性的函数。 您使用它们的原因是因为通常将类属性定义为private ,这意味着您只能在类方法中直接引用它们。

getter是一个public方法(意思是它可以从类本身外部调用),它返回一个私有值。 这允许该属性保持私有,但仍可在课堂外访问。

setter是一个设置私有值的public方法。 正如您可能已经猜到的那样,这允许该属性保持私有但仍然被设置在该类之外。

Setter和getter只是用于访问与类关联的字段的方法:

class Demo {

    int a;

    public Demo () { a=4; }

    public int getDemo () { return a; }

    public void setDemo (int a) { this.a=a; }

}

getter和setter是一种访问与类关联的Java Bean属性的方法。 它只是能够访问该类有兴趣共享的公共字段的标准方法。 它们由Java Bean规范定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM