final和static在Java中的用法和区别

final和static在Java中的用法和区别



前言

在Java中,final和static是两个常用的关键字,它们各自有不同的用途和语义,但它们在某些上下文中也可以一起使用。下面,我会详细解释这两个关键字以及它们的区别,并通过一些例子来加以说明。


一、final 关键字?

final关键字在Java中主要有三种用途:

  1. 修饰数据:当一个变量被声明为final时,它的值就不能被改变。这通常用于定义常量。
final int MAX_VALUE = 100;  
// MAX_VALUE = 200; // 后续赋值的这行会导致编译错误
  1. 修饰方法:一个被final修饰的方法不能被子类覆盖(即重写)。这通常用于确保某个方法的行为在继承体系中保持不变。
class Parent {  
    final void show() {  
        System.out.println("Parent show()");  
    }  
}  
  
class Child extends Parent {  
    // void show() { // 这行会导致编译错误,因为show()方法在Parent类中被声明为final  
    //     System.out.println("Child show()");  
    // }  
}
  1. 修饰类:一个被final修饰的类不能被继承。这通常用于创建一些不希望被扩展的类,比如String类。
final class FinalClass {  
    // ...  
}  
  
// class AnotherClass extends FinalClass { // 这行会导致编译错误,因为FinalClass类被声明为final  
//     // ...  
// }

二、static 关键字

static关键字在Java中主要有两种用途:

  1. 修饰变量:当一个变量被声明为static时,它属于类本身而不是类的实例。这意味着你可以不创建类的对象而直接访问这个变量。这种变量也被称为类变量或静态变量。
class StaticExample {  
    static int staticVar = 42;  
}  
  
public class Main {  
    public static void main(String[] args) {  
        System.out.println(StaticExample.staticVar); // 输出 42  
    }  
}
  1. 修饰方法:一个被static修饰的方法属于类本身,而不是类的实例。这意味着你可以在不创建类的对象的情况下调用这个方法。这种方法也被称为类方法或静态方法。
class StaticExample {  
    static void staticMethod() {  
        System.out.println("This is a static method.");  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        StaticExample.staticMethod(); // 输出 "This is a static method."  
    }  
}

三、final 和 static 的区别

  1. 用途不同
    final确保不变性,无论是变量的值、方法的实现还是类的结构。
    static定义与类关联而非与类的特定实例关联的变量或方法。
  2. 初始化时机
    final变量必须在声明时或构造器中初始化。
    static变量在类加载时初始化,只初始化一次。
  3. 生命周期
    final变量的生命周期取决于其所属的对象的生命周期。
    static变量的生命周期与类本身相关,只要类被加载到JVM中,static变量就存在。
  4. 访问方式
    final变量通常通过对象实例访问(除非它是静态的)。
    static变量可以通过类名直接访问,无需创建对象实例。
  5. 内存存储
    final变量(非静态)存储在对象实例的内存中。
    static变量存储在类的内存区域中(方法区),而非对象的内存中。

结合final和static使用时,通常用于定义类的常量,这些常量既属于类本身(static),又不可改变(final)。

public class Constants {  
    public static final int MAX_VALUE = 100; // 这是一个属于类本身的不可变常量  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jz_Stu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值