java中static和const和final的区别

static 关键字

static 关键字用于声明类的成员(方法或变量)为静态成员。静态成员属于类本身,而不是类的实例。换句话说,静态成员可以通过类名直接访问,而不需要实例化对象。

  • 静态变量:属于类的所有对象共享,类的所有实例共享相同的内存位置。
  • 静态方法:可以在没有创建对象的情况下直接调用。
  • 静态块:在类加载时执行一次,用于初始化类的静态成员。
  • 编译时机static 关键字主要在编译时确定。它告诉 JVM,该成员属于类而非实例,因此不需要通过对象来访问。static 修饰的变量和方法会被加载到 方法区 中的 类的结构部分
  • 内存存储位置static 成员存储在 方法区 中的 类的静态变量区。每个类只有一个静态变量区,所有实例共享这部分内存。静态方法也存储在方法区的 方法区(Method Area) 中。

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 是一个多用途的关键字,它可以用于变量、方法和类的定义,分别具有不同的含义。

  • 用于变量:声明为 final 的变量是常量,一旦赋值后不可更改(不可重新赋值)。
  • 用于方法:声明为 final 的方法不能被子类重写。
  • 用于类:声明为 final 的类不能被继承。
  • 编译时机final 关键字的使用在编译时就确定了变量、方法或类的行为。例如,如果一个方法被声明为 final,编译器会禁止任何子类重写该方法;如果一个类被声明为 final,编译器会禁止任何子类继承该类。对于变量,final 确保该变量一旦赋值后不可修改。
  • 内存存储位置
    • final 变量:常量(final 变量)通常在 方法区 中的 常量池(Constant Pool) 中存储。如果是局部变量,存储在栈中。
    • final 类和方法:存储在 方法区 中的 类的结构部分final 类和方法不会被继承或重写,因此它们在运行时不需要动态解析。

JavaC++在常量的表示上有区别Java使用关键字final表示常量,而C++使用关键字const表示常量。下面分别介绍JavaC++中常量的表示方式用法: 1. Java中常量的表示:Java中使用关键字final表示常量。final修饰的变量只能被赋值一次,一旦被赋值,就不能再次修改。final变量必须在声明时或者构造函数中进行初始化。final变量一般用大写字母表示,例如: ``` public class MyClass { public static final int MAX_VALUE = 100; public final String name; public MyClass(String name) { this.name = name; } } ``` 在上面的示例代码中,我们定义了一个final的静态变量MAX_VALUE一个final的实例变量name。静态变量MAX_VALUE在声明时进行了初始化,而实例变量name在构造函数中进行了初始化。一旦被赋值,这些变量的值就不能再次修改。 2. C++中常量的表示:C++中使用关键字const表示常量。const修饰的变量也只能被赋值一次,一旦被赋值,就不能再次修改。const变量必须在声明时进行初始化。const变量一般用大写字母表示,例如: ``` #include <iostream> using namespace std; class MyClass { public: static const int MAX_VALUE = 100; const string name; MyClass(string name) : name(name) {} }; int main() { cout << MyClass::MAX_VALUE << endl; MyClass obj("test"); cout << obj.name << endl; return 0; } ``` 在上面的示例代码中,我们定义了一个const的静态变量MAX_VALUE一个const的实例变量name。静态变量MAX_VALUE在声明时进行了初始化,而实例变量name在构造函数中进行了初始化。一旦被赋值,这些变量的值就不能再次修改。 总之,JavaC++在常量的表示上有一些区别,但是它们都具有相似的特性,即一旦被赋值,就不能再次修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

华东设计之美

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

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

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

打赏作者

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

抵扣说明:

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

余额充值