当前位置: 首页 > 面试题库 >

Java中静态变量与最终静态变量之间的区别

唐俊爽
2023-03-14
问题内容

通常,最终静态成员,尤其是变量(或静态最终变量,当然可以以任何顺序使用,而不会重叠含义)已广泛用于Java接口中,以定义实现类的 协议行为
,这意味着实现该类的类(继承)接口必须包含该接口的所有成员。

我无法区分 finalfinal静态
成员。final静态成员是一个声明为final或其他东西的静态成员?在哪些特定情况下应专门使用它们?

永远不能在方法内部,静态方法内部或实例方法内部声明静态变量或最终静态变量。为什么?

因此,如果尝试编译以下代码段,则编译器将不会发出编译时错误。

public static void main(String args[])
{
    final int a=0;  //ok

    int b=1;  //ok

    static int c=2;  //wrong

    final static int x=0;  //wrong
}

问题答案:

您正在将许多不同的概念混合在一起。甚至标题中的问题也与正文中的问题不符。

无论如何,这些是您正在混淆的概念:

  • 变数
  • 最终变量
  • 领域
  • 最终领域
  • 静态场
  • 最终静态场

该关键字static仅对字段有意义,但是在您显示的代码中,您试图在无法声明字段的函数中使用它(字段是类的成员;变量在方法中声明)。

让我们尝试快速描述它们。

  1. 变量 在方法中声明,并用作某种 可变的本地存储int x; x = 5; x++

  2. final变量 也在方法中声明,并用作 不可变的本地存储final int y; y = 0; y++; // won't compile)。它们对于发现某些人会尝试修改不应修改的错误很有用。我个人将大部分局部变量和方法参数作为参数final。另外,当您从内部匿名类引用它们时,它们是必需的。在某些编程语言中,唯一的变量类型是不可变变量(在其他语言中,“默认”类型的变量是不可变变量)-作为练习,请尝试弄清楚如何编写一个循环来运行变量。指定的次数,不允许在初始化后更改任何内容!(例如,尝试仅使用最终变量解决 fizzbuzz !)。

  3. 字段 定义了 对象可变状态 ,并在类(class x { int myField; })中声明。

  4. final字段 定义了 对象不变状态 ,它们在类中声明,并且必须在构造函数完成(class x { final int myField = 5; })之前初始化。它们不能被修改。它们在执行多线程处理时非常有用,因为它们具有与线程之间共享对象有关的特殊属性(如果在构造函数完成后共享对象,则可以确保每个线程都会看到对象的final字段的正确初始化值,并且即使它与数据竞争共享)。如果您想进行其他练习,请尝试仅使用final字段而不使用其他字段,而不使用任何变量或方法参数来再次解决 fizzbuzz (显然,您可以在构造函数中声明参数,仅此而已!)。

  5. 静态字段任何类的所有实例共享 。您可以将它们视为某种全局可变存储(class x { static int globalField = 5; })。最琐碎的(通常是无用的)示例是对对象的实例进行计数(即,class x { static int count = 0; x() { count++; } }在此构造函数每次调用对象时(即,每次x使用with 创建实例时new x())都增加计数。注意,与final字段不同,它们本质上不是线程安全的;换句话说,您肯定会得到错误的实例计数x如果从不同的线程实例化,请使用上面的代码;为了使其正确,您必须为此添加一些同步机制或使用一些专门的类,但这是另一个问题(实际上,它可能是整本书的主题)。

  6. 最终的静态字段全局常量class MyConstants { public static final double PI = 3.1415926535897932384626433; })。

还有许多其他细微的特性(例如:编译器可以自由地将对最终静态字段的引用直接替换为其值,这使反射在此类字段上无用;最终字段实际上可能会被反射修改,但这很容易出错;并且等等),但我想说您还有很长的路要走。

最后,也有可能与领域,如可使用其他关键词transientvolatile以及访问级别(publicprotectedprivate)。但这是另一个问题(实际上,如果您要询问这些问题,我会说很多其他问题)。



 类似资料:
  • 问题内容: 将变量声明为的区别是什么 要么 如果我只希望变量是局部的,并且是常量(以后不能更改)? 谢谢 问题答案: 仅仅具有预期的效果。 声明static使其成为一个类变量,使其可以使用类名进行访问

  • 问题内容: 我已经定义了一个对象并声明了一个静态变量。在该方法中,当我尝试打印实例和类变量时,两者都打印相同的值。 不是实例变量吗?它应该打印0而不是50吗? 问题答案: 不,只有一个变量-您尚未声明任何实例变量。 不幸的是,Java允许您访问静态成员,就像通过相关类型的引用访问静态成员一样。这是IMO的设计缺陷,某些IDE(例如Eclipse)允许您将其标记为警告或错误- 但这是语言的一部分。您

  • 问题内容: 此Java程序包含一个静态变量。但是我无法理解公共静态变量和私有静态变量之间的区别。 问题答案: 公共变量可在代码中的 任何 位置访问- 私有变量仅可在类本身内部访问。在这种情况下,您可以在类中使用它,所以很好。 请注意,静态变量是完全独立的问题-方法和类具有与变量相同的可访问性。 还有其他级别的访问权限- 和默认的“包”访问权限(无法明确指定)。有关更多详细信息,请参见Java语言规

  • 这个java程序包含一个静态变量。但是我不明白公共和私有静态变量之间的区别。

  • 问题内容: 我是Java编程的新手。谁能说出Java中的全局变量和局部变量之间的区别? 问题答案: 您的问题有点困惑,因为您在标题中引用的是static / global,而在问题中引用的是global / local。 变量绑定到一个 类 , 每个类 将有 一个实例 。 类可以具有成员变量,并且该类的 每个实例 将有 一个实例 。 请注意,如果您有多个类加载器,这将变得更加复杂。在这种情况下,您

  • 静态变量和实例变量之间的区别是什么。下面这句话是我无法理解的: 在某些情况下,一个类的所有对象只能共享一个特定变量的副本——这里使用静态变量。 静态变量代表类范围的信息。一个类的所有对象共享相同的数据。 我认为实例变量在类范围内使用,而静态变量只在它们自己的方法中有作用域?