java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java中static和const和final区别

java中static和const和final的区别及使用说明

作者:华东设计之美

还在为Java中的static、final和const关键字头疼吗?本文用大白话讲清它们的定义、用法、编译时机和内存存储位置,帮你彻底搞懂静态成员、常量以及为什么Java不用const,干货满满,快来学习吧

static关键字

static 关键字用于声明类的成员(方法或变量)为静态成员。静态成员属于类本身,而不是类的实例。

换句话说,静态成员可以通过类名直接访问,而不需要实例化对象。

count 是静态变量,在两个 Counter 对象中共享,displayCount 是静态方法,可以通过类名直接调用。

class Counter {
    static int count = 0;  // 静态变量
    
    Counter() {
        count++;  // 每次创建对象时,静态变量 count 会增加
    }

    static void displayCount() {
        System.out.println("Count: " + count);  // 静态方法可以直接访问静态变量
    }
}

public class Main {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter.displayCount();  // 调用静态方法,输出 Count: 2
    }
}

final关键字

final 是一个多用途的关键字,它可以用于变量、方法和类的定义,分别具有不同的含义。

内存存储位置:

PI 被声明为 final,因此它的值不能更改。

// final 变量
class Circle {
    final double PI = 3.14159;  // 常量,值不可更改
    
    void calculateArea(double radius) {
        double area = PI * radius * radius;  // 使用常量
        System.out.println("Area: " + area);
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle();
        circle.calculateArea(5);
        // PI = 3.14;  // 编译错误,无法修改 final 变量的值
    }
}

const关键字

在 Java 中,const 是一个保留关键字,但它并没有在语言中实现功能,实际上 Java 中并不使用 const 来定义常量。Java 提供了 final 来替代 const 的功能。

使用 const 会导致编译错误,因为 const 在 Java 中并没有实际作用。 

// const 在 Java 中并不使用
public class Main {
    public static void main(String[] args) {
        // const int x = 10;  // 编译错误,const 不被使用
    }
}
特性staticfinalconst
定义用于类的成员(方法、变量)指定该成员为静态的用于变量、方法、类,表示常量、不允许修改或重写目前在 Java 中没有实现
使用场景当需要共享数据或功能时使用用于常量、禁止继承/重写的方法、不可修改的变量Java 中不使用 const
作用域静态成员属于类,而不是实例对象变量不可修改,方法不可重写,类不可继承不被使用
示例static int count;final int x = 10;不支持
静态方法静态方法可以在没有实例化对象的情况下直接调用不适用不适用
继承/重写静态成员可以被继承,但不可以被重写final 方法不能被重写,final 类不能被继承不适用
关键字编译时机内存存储位置说明
static编译时方法区 中的 类的静态变量区,静态方法也存储在方法区中static 成员属于类而非实例,所有实例共享这部分内存
final编译时方法区的常量池 或 堆栈(针对局部变量)final 变量会存储在常量池中,final 方法和类存储在方法区
const编译时不会被使用const 是保留关键字,Java 没有实际应用,通常用 final 代替

完整示例

class Person {
    static String species = "Homo sapiens";  // 静态变量
    final String name;  // 常量,必须在构造方法中初始化

    Person(String name) {
        this.name = name;
    }

    // final 方法,不能被子类重写
    final void showDetails() {
        System.out.println("Name: " + name + ", Species: " + species);
    }
}

class Student extends Person {
    Student(String name) {
        super(name);
    }

    // 编译错误,无法重写 final 方法
    // void showDetails() { 
    //     System.out.println("Student: " + name);
    // }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice");
        person.showDetails();  // 调用父类的 final 方法
        
        // 通过类名访问静态变量
        System.out.println("Species: " + Person.species);

        // 修改静态变量
        Person.species = "Homo erectus";
        System.out.println("Updated Species: " + Person.species);

        // name = "Bob";  // 编译错误,final 变量不可修改
    }
}

Java 内存区的详细说明

1.方法区(Method Area)

2.堆(Heap)

3.栈(Stack)

4.程序计数器(Program Counter Register)

5.本地方法栈(Native Method Stack)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文