前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java | 字段(Field)

Java | 字段(Field)

原创
作者头像
Blume
修改2021-04-06 10:03:56
2.6K0
修改2021-04-06 10:03:56
举报
文章被收录于专栏:Java 文苑
字段
字段

前言

  • 本文原创作者为 Blume,版权归原创作者所有。
  • 本文主要内容根据 Java 官方教程中《课程:语言基础》和《课程:类和对象》的相关章节编写而成。
  • 本文更新(修订)于 2021 年 4 月 5 日。
  • 本文网址为 https://cloud.tencent.com/developer/article/1807403
  • 商业性转载请联系原创作者,非商业性转载请注明出处。

概述

字段(Field),是 Java 编程语言中类的一个成员,主要用来存储对象的状态(如同某些编程语言中的变量),所以有时也可称为成员字段或成员变量。

在类中有下列几种变量(Variable):

  • 类中的成员变量,称为字段。
  • 代码块中的变量,称为局部变量
  • 方法和构造方法声明中的变量,称为参数

局部变量参数始终被归类为“变量”(而不是“字段”)。

声明字段

代码语言:txt
复制
/**
 * 字段示例
 *
 * @author Blume
 */
public class FieldDemo {
    public static void main(String[] args) {

        // 类中的常量字段可直接访问而无需创建对象。
        System.out.println(MyField.CONSTANT_FIELD);
        System.out.println("---- ---- ---- ---- ----");

        // 类中的静态字段可直接访问而无需创建对象。
        MyField.sharedField = "sharedField:\n这是在 MyField 类中的字符串静态字段。";
        System.out.println(MyField.sharedField);
        System.out.println("---- ---- ---- ---- ----");

        // 类中的实例变量只有在创建对象后才能访问。
        final MyField demo = new MyField();
        demo.setName("name:\n这是在 MyField 类中的字符串实例变量。");
        System.out.println(demo.getName());
    }
}

/**
 * 定义 MyField 类
 *
 * @author Blume
 */
class MyField {

    // 声明一个常量字段。
    public static final String CONSTANT_FIELD =
            "CONSTANT_FIELD:\n这是在 MyField 类中的字符串常量字段。";

    // 声明一个静态字段。
    public static String sharedField;

    // 声明一个实例变量。
    private String name;

    // 获取实例变量值。
    public String getName() {
        return name;
    }

    // 设置实例变量值。
    public void setName(String name) {

        // 可插入用于更改实例变量值的条件判断语句,
        // 以防实例变量值被意外或非法更改。
        this.name = name;
    }
}
/* 输出结果:
CONSTANT_FIELD:
这是在 MyField 类中的字符串常量字段。
---- ---- ---- ---- ----
sharedField:
这是在 MyField 类中的字符串静态字段。
---- ---- ---- ---- ----
name:
这是在 MyField 类中的字符串实例变量。
 */

如上例所示,字段声明通常包括下列几个部分,顺序如下:

  1. 零个、一个或多个修饰符,如 public、protected、private、static、final 等。
  2. 类型。
  3. 字段名。

修饰符

可在字段声明的开头部分添加 public、protected 或 private 访问修饰符或者不加,用来表示字段的访问控制级别。

也可在访问修饰符之后添加其他修饰符:

  • 若添加 final 修饰符,则表示该字段的值在初始化后保持不变,即它只接受首次分配给它的值,之后在其生命期内无法改变,类似于常量,可作为对字段值的一种限定和保护。
  • 若添加 static 修饰符,则表示该字段可直接访问而无需创建对象。或者说,这是在告诉 Java 编译器,无论该字段所在的类被实例化了多少次,该字段始终都存在,故可作为该类所有实例的共有字段。
  • 提示:不允许添加 abstract 修饰符,因为字段本质上是实体,不存在抽象字段。否则,Java 编译器将会生成一条类似于“此处不允许使用修饰符 abstract”的错误消息。

类型

所有字段,包括局部变量参数,都必须具有类型。

可使用原初类型(Primitive Type):

  • boolean:表示一个布尔值,它的取值只有两个:truefalse
  • char:表示一个单一的 16 位 BMP 字符,它的取值范围在 '\u0000'(0)至 '\uffff'(65535)之间。
  • byte:表示一个 8 位有符号字节,它的取值范围在 -128127 之间。
  • short:表示一个 16 位有符号字(双字节),它的取值范围在 -3276832767 之间。
  • int:表示一个 32 位有符号整数(四字节),它的取值范围在 -21474836482147483647 之间。
  • long:表示一个 64 位有符号长整数(八字节),它的取值范围在 -92233720368547758089223372036854775807 之间。
  • float:表示一个 32 位单精度浮点数。
  • double:表示一个 64 位双精度浮点数。
  • 提示:“Primitive Type”,在不同的文章和资料中被翻译为“原始类型”、“内置类型”、“简单类型”、“基元类型”、“基础类型”、“基本类型”等等。本文笔者所写的其他相关文章中统一称之为“原初类型”。

也可使用引用类型(Reference Type):

  • Boolean:表示一个 boolean 值。
  • Character:表示一个 char 值。
  • Byte:表示一个 byte 值。
  • Short:表示一个 short 值。
  • Integer:表示一个 int 值。
  • Long:表示一个 long 值。
  • Float:表示一个 float 值。
  • Double:表示一个 double 值。
  • String:表示一个字符串。
  • ClassDesc,表示一个对类、接口、数组或原初类型进行描述的标称描述符。
  • 提示:所有的类名和接口名都可作为引用类型,比如前面示例中的 MyField。

还可使用类、接口或原初类型的数组类型(Array Type)。比如,int[] 表示一个 int 原初类型的一维数组类型(请参阅 arrayType(int) 示例)等。

字段名

所有变量,无论是成员变量、局部变量还是参数,都应遵循以下的命名规则和约定:

  • 变量名可以是任何合法的标识符:
    • 字母(a - zA - Z):长度不限。
    • 数字(0 - 9):长度不限。
    • 美元符($):按惯例,根本不使用美元符。一些自动生成的名称中可能会包含美元符(请参阅 nested(String) 示例),但变量名应始终避免使用它。
    • 下划线(_):按惯例,变量名不使用下划线。下划线只用于常量字段名。
    • 不允许使用空格符。
  • 按惯例,变量名以字母开头,后续字符可以是字母或数字。
    • 从技术上讲,以美元符或下划线开头是合法的,但不鼓励这种做法。
    • 后续字符应避免使用美元符和下划线,尽管这样做也是合法的。
    • 不允许以数字开头。
  • 为变量选择名称时,请使用完整单词,这样做可使代码更易于阅读和理解。
    • 应避免使用晦涩难懂的缩写。
    • 不允许将关键字或保留字用作变量名。如 packageimportclassinterfacedefault 等等。
  • 变量名对大小写敏感,如 demoDEMO 将视为两个名称。
    • 如果只有一个单词,请将单词中的字母全部小写。如前面示例中的 name 字段。
    • 如果由多个单词组成,请将第一个单词中的字母全部小写,并将紧跟其后的每个单词的首字母大写。如前面示例中的 sharedField 字段。

除下列两项外,变量的命名规则和约定适用常量字段:

  • 名称中的字母应全部大写。
  • 若由多个单词组成,则单词之间用下划线分隔。如前面示例中的 CONSTANT_FIELD 字段。

字段名不能与同一类中另一个字段的名称相同。若字段与其所在类中的局部变量参数具有相同的名称,则会发生遮蔽。具体请参阅《遮蔽 - 重名问题》。

分类

按使用修饰符的不同,字段可分为:

  • 常量字段:声明为 static final 的字段,可视为常量(Constant)。由于常量字段与对象是否创建无关,所以在定义类时就要给定其初始值。如前面示例中的 CONSTANT_FIELD 字段。
  • 静态字段(Static Field):声明为 static 的字段。常量字段和类变量都属于静态字段。
  • 非静态字段(Non-Static Field):没有声明为 static 的字段。又可称为实例变量。
  • 成员变量(Member Variable):除常量字段外的其他所有字段。
    • 实例变量(Instance Variable):没有声明为 static 的成员变量,它就是非静态字段。从技术上讲,对象将各自的状态存储在“实例变量(非静态字段)”中,它们的值对类的每个实例(每个对象)来说都是独有的。因此,本着封装的精神,将实例变量(非静态字段)声明为 private 是值得提倡的。如前面示例中的 name 字段。
    • 类变量(Class Variable):声明为 static 的成员变量,它属于静态字段。如前面示例中的 sharedField 字段。
    • 提示:声明为 final 的成员变量,类似于常量,可作为对成员变量值的一种限定和保护。

访问字段

字段通过其名称进行访问。在访问时,必须使用明确无误的名称。

在方法中,可使用一个简单名称来表示其所在类中的字段:

代码语言:txt
复制
    public String getName() {
        return name;
    }

在这种情况下,name 是简单名称。

引用静态字段

由于静态字段与对象的创建无关,所以在访问它时,使用类名或相关表达式,然后是点(.)操作符,然后是静态字段的简单名称:

代码语言:txt
复制
        System.out.println(MyField.CONSTANT_FIELD);
        System.out.println(MyField.sharedField);

引用非静态字段

若非静态字段没有声明为 private,则在它所在的类外访问它时,必须使用对象引用或相关表达式,然后是点(.)操作符,然后是非静态字段的简单名称。

更改实例变量值

建议将实例变量声明为 private,否则可能会产生面条式代码(Spaghetti Code)。如果可在类外更改该类中的实例变量值,那么该实例变量将会变得不确定,因为任何一段在类外的代码都有可能改变其值。

可使用方法来更改实例变量值:

代码语言:txt
复制
    public void setName(String name) {

        // 可插入用于更改实例变量值的条件判断语句,
        // 以防实例变量值被意外或非法更改。
        this.name = name;
    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 概述
  • 声明字段
    • 修饰符
      • 类型
        • 字段名
        • 分类
        • 访问字段
          • 引用静态字段
            • 引用非静态字段
              • 更改实例变量值
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档