Java POJO中的字段,变量,属性和属性有什么区别?

时间:2012-04-11 23:51:27

标签: java pojo

当引用具有getter / setter的Java POJO的内部私有变量时,我使用了以下术语:

  • 字段
  • 可变
  • 属性
  • 属性

上述之间有什么区别吗?如果是这样,使用的正确术语是什么?持有此实体时是否有不同的术语?

11 个答案:

答案 0 :(得分:114)

从这里开始:http://docs.oracle.com/javase/tutorial/information/glossary.html


  • 字段

    • 班级的数据成员。除非另有说明,否则字段不是静态的。

  • 属性

    • 用户可以设置的对象的特征,例如窗口的颜色。

  • 属性

    • 未在上述词汇表中列出

  • 可变

    • 由标识符命名的数据项。每个变量都有一个类型,例如int或Object,以及一个范围。另请参见类变量,实例变量,局部变量。

答案 1 :(得分:82)

是的,有。

变量可以是本地,字段或常量(尽管这在技术上是错误的)。它像属性一样模糊。此外,您应该知道有些人喜欢称最终非静态(本地或实例)变量

“的”。这可能来自Scala等新兴的JVM FP语言。

字段通常是实例类的私有变量。这并不意味着有吸气剂和固定剂。

属性是一个模糊的术语。它很容易与XML或Java Naming API混淆。尽量避免使用该术语。

属性是getter和setter组合。

以下一些例子

public class Variables {

    //Constant
    public final static String MY_VARIABLE = "that was a lot for a constant";

    //Value
    final String dontChangeMeBro = "my god that is still long for a val";

    //Field
    protected String flipMe = "wee!!!";

    //Property
    private String ifYouThoughtTheConstantWasVerboseHaHa;

    //Still the property
    public String getIfYouThoughtTheConstantWasVerboseHaHa() {
        return ifYouThoughtTheConstantWasVerboseHaHa;
    }

    //And now the setter
    public void setIfYouThoughtTheConstantWasVerboseHaHa(String ifYouThoughtTheConstantWasVerboseHaHa) {
        this.ifYouThoughtTheConstantWasVerboseHaHa = ifYouThoughtTheConstantWasVerboseHaHa;
    }

}

还有更多组合,但我的手指累了:)

答案 2 :(得分:5)

如果您的问题是通过使用JAXB提示并想要选择正确的XMLAccessType,那么我有同样的问题。 JAXB Javadoc表示“字段”是非静态的非瞬态实例变量。 “属性”具有getter / setter对(因此它应该是私有变量)。 “公共成员”是公开的,因此可能是一个常数。同样在JAXB中,“属性”指的是XML元素的一部分,如<myElement myAttribute="first">hello world</myElement>中所示。

一般来说,Java“属性”似乎可以定义为至少包含getter或其他一些允许您获取其值的公共方法的字段。有些人还说房产需要有一个二传手。对于这样的定义,上下文就是一切。

答案 3 :(得分:5)

Dietel和Dietel有一个很好的解释字段与变量的方法。

“将类的静态变量和实例变量一起称为其字段。”(第6.3节)

“只有当变量需要在类的多个方法中使用或者程序应该在对类的方法的调用之间保存它们的值时,才应将变量声明为字段。”(第6.4节)

所以类的字段是它的静态或实例变量 - 即用类范围声明。

参考 - Dietel P.,Dietel,H。 - Java™如何编程(早期对象),第十版(2014)

答案 4 :(得分:2)

如果从Hibernate中获取线索:

Hibernate使用其字段读取/写入Object的状态。 Hibernate还将Java Bean样式属性映射到DB Schema。 Hibernate访问用于加载/保存对象的字段。 如果映射是由属性完成的,那么hibernate使用getter和setter。

区分的Encapsulation意味着你有一个字段的getter / setter,它被称为属性,我们在setMethod中隐藏了该属性的底层数据结构,我们可以防止setter中的不必要的更改。所有封装代表......

字段必须在使用之前声明并初始化。主要用于课堂内部使用。

可以通过setter更改

属性,它们会被getter公开。这里的现场价格有吸气剂/定型剂所以它是财产。

class Car{
 private double price;
 public double getPrice() {…};
 private void setPrice(double newPrice) {…};
}

<class name="Car" …>
<property name="price" column="PRICE"/>
</class>

同样使用字段,[在hibernate中,它是使用字段进行MAP的推荐方法,其中private int id;注释@Id,但使用Property,你有更多的控制权]

class Car{
  private double price;
}
<class name="Car">
<property name=" price" column="PRICE" access="field"/>
</class>

Java doc说: Field是类的数据成员。字段是非静态的非瞬态实例变量。 Field通常是实例类的私有变量。

答案 5 :(得分:2)

Java 中变量、字段、属性和属性之间的区别:

变量是指定给内存位置的名称。它是程序中存储的基本单位。

字段是类的数据成员。除非另有说明,字段可以是公共的、静态的,而不是静态和最终的。

属性是字段的另一个术语。它通常是一个可以直接访问的公共字段。

  • 在 NetBeans 或 Eclipse 中,当我们键入类的对象并在点 (.) 之后,它们会给出一些称为属性的建议。

属性是用于字段的术语,但通常具有 getter 和 setter 组合。

答案 6 :(得分:1)

变量由字段和非字段组成。

字段可以是:

  1. 静态字段或
  2. 非静态字段也称为实例化,例如x = F()
  3. 非字段可以是:

    1. 局部变量,字段的类比,但在方法内而不是在所有方法之外,或
    2. 参数,例如y在x = f(y)
    3. 总之,变量之间的关键区别在于它们是字段还是非字段,这意味着它们是在方法内还是在所有方法之外。

      基本示例(请原谅我的语法,我只是一个初学者)

      Class {    
          //fields    
      
          method1 {              
               //non-fields    
      
          }    
      }
      

答案 7 :(得分:1)

实际上这两个术语通常用于表示相同的事物,但有一些例外情况。字段可以存储对象的状态。所有字段都是变量。很明显,可能存在不是字段的变量。因此,查看4种类型的变量(类变量,实例变量,局部变量和参数变量),我们可以看到类变量和实例变量可以影响对象的状态。换句话说,如果类或实例变量发生更改,则对象的状态会发生变化。所以我们可以说类变量和实例变量是字段,而局部变量和参数变量不是。

如果您想更深入地了解,可以访问以下来源: -

http://sajupauledayan.com/java/fields-vs-variables-in-java

答案 8 :(得分:0)

问题是陈旧但变量和字段之间的另一个重要区别是字段在声明时获得默认值。另一方面,变量必须初始化。

答案 9 :(得分:0)

我的理解如下,我并不是说这是100%正确的,我可能也错了..

变量是您声明的内容,默认情况下可以更改并具有不同的值,但也可以明确地说是最终的。在Java中将是:

public class Variables {

    List<Object> listVariable; // declared but not assigned
    final int aFinalVariableExample = 5; // declared, assigned and said to be final!

    Integer foo(List<Object> someOtherObjectListVariable) {
        // declare..
        Object iAmAlsoAVariable;

        // assign a value..
        iAmAlsoAVariable = 5;

        // change its value..
        iAmAlsoAVariable = 8;

        someOtherObjectListVariable.add(iAmAlsoAVariable);

        return new Integer();
    }
}

所以基本上,变量是声明的任何东西,可以保存值。上面的方法foo返回一个变量,例如..它返回一个Integer类型的变量,它保存新Integer()的内存地址;您在上面看到的所有其他内容也是变量,listVariable,aFinalVariableExample,并在此处进行解释:

字段是范围更清晰(或具体)的变量。从方法foo的范围返回的变量在上面的例子中并不清楚,所以我不会把它称为字段。另一方面,iAmAlsoVariable是一个“本地”字段,受foo方法的范围限制,而listVariable是一个“实例”字段,其中字段(变量)的范围受对象范围的限制。

属性是可以访问/变异的字段。暴露getter / setter的任何字段都是属性。

我不知道属性,我还想重复一下,这是我对变量,字段和属性的理解。

答案 10 :(得分:0)

  • variable-命名的存储地址。每个变量都有一个定义内存大小,属性和行为的类型。 Java变量的类型为:class variableinstance variablelocal variablemethod parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field-成员变量或数据成员。它是variableclassclass variable)内的instance variable

  • attribute-在某些文章中,您会发现attributeobject的{​​{1}}表示。 class variableObject操作,该操作定义了一组特征。

attributes
  • CustomClass myCustomClass = new CustomClass(); myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value -property +界field。它具有字段语法,但在内部使用方法。 getter/setter不完全支持它。看看JavaObjective-CSwift

例如Kotlin样本:

Kotlin

[Swift variable, property]