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


142

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

  • 领域
  • 变量
  • 属性
  • 属性

两者之间有什么区别吗?如果是这样,正确使用的术语是什么?保留该实体时是否有其他术语使用?

Answers:


117

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


  • 领域

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

  • 属性

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

  • 属性

    • 上面的词汇表中未列出

  • 变量

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

27
我仍然不了解字段和属性之间的区别?
Koray Tugay,2015年

1
@KorayTugay-将字段视为与对象相关的基本数据。属性(对我而言)是对象的特征,该对象对于外界是可见的(并且显然是可变的)。
jahroy 2015年

基于上述情况,可以说“属性和字段是相同的,除了属性是可设置的字段之外”?
jdurston

2
@John-可能基于以上内容,如上所述,这是Oracle的副本/粘贴。就个人而言,我会区分一个属性是公开可见的,并且可能是可变的,而字段可以是仅由类使用的内部私有字段。
jahroy 2015年

1
我认为最好强调的是,作为领域和财产的存在并不相互排斥。从答案的措辞方式到新开发人员,它看起来像一堆不同的东西。
Kartik Chugh

89

就在这里。

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

价值观 ”。这可能来自新兴的JVM FP语言,例如Scala。

字段通常是实例类上的私有变量。这并不意味着有一个getter和setter。

属性是一个模糊的术语。它很容易与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;
    }

}

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


3
@Chris Thompson那就是Eclipse在其对话框之一中称之为的东西。大家好,它的Java。我能告诉你什么。这没有道理。
亚当·根特

4
@AdamGent JAVA =只是另一个模糊的缩写:)
埃默里

@emory好吧,这是古老的众所周知的oxymoron。那不是Java特有的,“问题”至少可以追溯到C甚至更长。.显然,没有什么可以阻止您将其称为“常数”
Voo 2012

@AdamGent并不认真,只是给您带来困难;-)
Chris Thompson

1
很好的解释,同时嘲笑标识符名称的长度如何荒谬(而且它们的确经常变得荒谬)。
sargas

5

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

看起来,Java“属性”通常可以定义为具有至少一个getter或其他一些允许您获取其值的公共方法的字段。有人还说,财产需要有塞特犬。对于这样的定义,上下文就是一切。


5

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

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

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

因此,类的字段是其静态或实例变量-即使用类范围声明。

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


3

如果您从Hibernate获得线索:

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

区别就是封装,这意味着您在一个字段中有一个getter / setter,它被称为property,并以此将其隐藏在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>

类似地,使用fields [在休眠状态,这是使用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是类的数据成员。字段是非静态,非瞬态实例变量。字段通常是实例类上的私有变量。


2

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

字段可以是:

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

非字段可以是:

  1. 局部变量,字段的类似物,但在方法内部而不是在所有方法外部,或者
  2. 参数,例如x中的y = f(y)

总之,变量之间的关键区别在于它们是字段还是非字段,这意味着它们是在方法内部还是在所有方法外部。

基本示例(对不起我的语法,我只是一个初学者)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}

1

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

如果您想更深入地了解,可以转到以下资源:

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


0

这个问题很老,但是变量和字段之间的另一个重要区别是,声明字段时会获得默认值,而变量必须初始化。


财产怎么样?
Koray Tugay

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方法的任何字段都是一个属性。

我不了解属性,我想重复一遍,这是我对变量,字段和属性的理解。


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

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field-成员变量或数据成员。它是(或)variable内部classclass variableinstance variable

  • attribute -在某些文章中,您会发现 attribute它是的object代表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。它具有字段语法,但在内部使用方法。Java不以纯形式支持它。在看看Objective-CSwiftKotlin

例如Kotlin示例:

//field - Backing Field
class Person {
    var name: String = "default name"
        get() = field
        set(value) { field = value }
}

//using
val person = Person()
person.name = "Alex"    // setter is used
println(person.name)    // getter is used

[快速变量,属性]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.