静态和最终之间的区别?

2022-08-31 06:27:45

我总是在java中的关键字之间感到困惑。staticfinal

它们有何不同?


答案 1

静态关键字可用于 4 种场景

  • 静态变量
  • 静态方法
  • 静态代码块
  • 静态嵌套类

让我们先看一下静态变量和静态方法。

静态变量

  • 它是一个属于类而不是对象(实例)的变量。
  • 静态变量在执行开始时仅初始化一次。这些变量将首先初始化,然后再初始化任何实例变量。
  • 由类的所有实例共享的单个副本。
  • 静态变量可以通过类名直接访问,不需要任何对象。
  • 语法:Class.variable

静态方法

  • 它是一种属于类而不是对象(实例)的方法。
  • 静态方法只能访问静态数据。它无法访问非静态数据(实例变量),除非它具有/创建了类的实例。
  • 静态方法只能调用其他静态方法,不能从中调用非静态方法,除非它具有/创建了类的实例。
  • 静态方法可以通过类名直接访问,不需要任何对象。
  • 语法:Class.methodName()
  • 静态方法无论如何都不能引用或关键字。thissuper

静态类

Java也有“静态嵌套类”。静态嵌套类只是一个不隐式引用外部类实例的类。

静态嵌套类可以具有实例方法和静态方法。

Java中没有顶级静态类这样的东西。

附注:

main 方法是因为它必须是可访问的,应用程序才能在任何实例化发生之前运行。static

final关键字在几个不同的上下文中用于定义以后无法更改的实体。

  • 类不能被子类化。这样做是出于安全性和效率的原因。因此,许多 Java 标准库类是 ,例如 和 。类中的所有方法都是隐式的 。finalfinaljava.lang.Systemjava.lang.Stringfinalfinal

  • 方法不能被子类覆盖。这用于防止子类更改方法的意外行为,该方法可能对类的功能或一致性至关重要。final

  • 一个变量只能通过初始值设定项或赋值语句初始化一次。它不需要在声明点初始化:这称为变量。类的空白最终实例变量必须在声明它的类的每个构造函数的末尾明确赋值;类似地,必须在声明它的类的静态初始值设定项中明确分配空白的最终静态变量;否则,在这两种情况下都会发生编译时错误。finalblank final

注: 如果变量是引用,则意味着不能重新绑定该变量以引用另一个对象。但是,如果它引用的对象最初是可变的,则它仍然是可变的。

在方法主体中定义匿名内部类时,可以从内部类中访问在该方法的作用域中声明的所有变量。一旦赋值,最终变量的值就无法更改。final


答案 2

static 意味着它属于类而不是实例,这意味着在特定的所有实例之间只共享该变量/方法的一个副本。

public class MyClass {
    public static int myVariable = 0; 
}

//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances

MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();

MyClass.myVariable = 5;  //This change is reflected in both instances

final是完全不相关的,它是一种定义一次初始化的方法。您可以在定义变量时进行初始化,也可以在构造函数中进行初始化,而在其他任何地方都无法进行。

注意关于最终方法和最终类的说明,这是一种明确声明方法或类不能分别覆盖/扩展的方法。

额外阅读因此,关于静态的话题,我们谈论的是它可能具有的其他用途,它有时用于静态块。使用静态变量时,有时需要在使用类之前设置这些变量,但不幸的是,您没有获得构造函数。这就是静态关键字的用武之地。

public class MyClass {

    public static List<String> cars = new ArrayList<String>();

    static {
        cars.add("Ferrari");
        cars.add("Scoda");
    }

}

public class TestClass {

    public static void main(String args[]) {
        System.out.println(MyClass.cars.get(0));  //This will print Ferrari
    }
}

您不能将此与实例初始值设定项块混淆,这些块在每个实例的构造函数之前调用。


推荐