Java中final与static关键字特点以及使用

final在Java中用于修饰类、方法和变量,确保它们不可被继承、重写或重新赋值。static修饰的成员属于类,而非对象,可以在没有对象的情况下被调用。静态变量在类加载时初始化,由所有对象共享,而静态方法只能访问静态成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.final的用法和特点

 final:的英文意思是最终的,在Java中也可以理解为:最终的不可变的。

final是一个修饰符, 可以用来修饰类、方法、成员变量、局部变量。 

特点:

  • 类:被修饰的类,不能被继承。

  • 方法:被修饰的方法,不能被重写。

  • 变量:被修饰的变量,不能被重新赋值

1.1基础使用创建方式如下:

/*
  (1)final修饰变量
变量:被修饰的变量,不能被重新赋值,只能被赋值一次,再次赋值会报错。

*/
final int a=1;
a=2;//此时会报错



/*
  (2)static修饰类
类:被修饰的类,不能被继承。


*/

final class 类名 {  
}


/*
  (3)final修饰方法:被修饰的方法,不能被重写。

*/

​
修饰符 final 返回值类型 方法名(参数列表){    
    //方法体
}

​

1.2 修饰变量

1.2.1局部变量——基本类型

基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。

使用如下:

public class FinalTest1 {
    public static void main(String[] args) {        
        // 声明变量,使用final修饰
        final int a;
        // 第一次赋值 
        a = 10;
        // 第二次赋值
        a = 20; // 报错,不可重新赋值

        // 声明变量,直接赋值,使用final修饰
        final int b = 10;
        // 第二次赋值
        b = 20; // 报错,不可重新赋值
    }
}

1.3.2局部变量——引用类型

引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改,代码如下:

 public class FinalTest2 {
    public static void main(String[] args) {
        // 创建 User 对象
        final   User u = new User();
        // 创建 另一个 User对象
        u = new User(); // 报错,指向了新的对象,地址值改变。 
        // 调用setName方法
        u.setName("张三"); // 可以修改
    }
}

1.3.3成员变量

被final修饰的常量名称,一般都有书写规范,所有字母都大写。

 public class User {
    final String USERNAME = "张三";    
//被final修饰的常量名称,一般都有书写规范,所有字母都大写。
    private int age;
    public User(String username, int age) {       
        this.USERNAME = username;
        this.age = age;
}

2.static的特点及使用

 2.1static的特点

   

       它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。

       当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作

         当 static 修饰成员方法时,该方法称为类方法 。静态方法在声明中有 static ,可以使用类名来调用,而不需要创建类的对象。调用方式非常简单。 因此我们平常所用的工具类都是通过此方式来实现的。

调用格式:

// 访问类变量 
类名.类变量名;
// 调用静态方法 
类名.静态方法名(参数);

代码演示:

学生类:

public class Student {
    String name;
    int age;
    static String class_banji="一年级3班";
    public static void show(){
        System.out.println("我是学生类中的静态方法");
    }

}

测试类;

//测试类
public class Test {
    public static void main(String[] args) {
        //在不创建student实例的情况下,调用类中的静态变量
        System.out.println(Student.class_banji);
        //在不创建student实例的情况下,可以直接调用类中的静态方法
        Student.show();
    }
}

static的知识点小结:

  1. 静态变量:静态变量是在类加载时创建的,它的生命周期和类一样长。静态变量可以通过类名直接访问,而不需要创建对象。静态变量被所有类的对象共享,因此如果一个对象修改了静态变量的值,那么这个值会被所有对象共享。

  2. 静态方法:静态方法也是在类加载时创建的,它不需要对象就可以被调用。静态方法只能访问静态变量和其他静态方法,它不能访问非静态变量和非静态方法。静态方法通常用于实用方法,例如Math类中的静态方法。

  3. 静态块:静态块是在类加载时执行的,它可以用来初始化静态变量。静态块只会执行一次,无论创建多少个对象。

  4. 。。。

被static修饰的内容:

  • 是随着类的加载而加载的,且只加载一次。

  • 存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。

  • 它优先于对象存在,所以,可以被所有对象共享。

在Java程序运行时,类的静态成员被static修饰,包括静态变量和静态方法)会在类加载时被初始化,并且会被存储在方法区中的静态存储区域中。

当程序第一次使用某个类时,JVM会加载该类的字节码文件,并将该类的静态成员加载到内存中。这个过程包括以下几个步骤:

  1. 加载:将类的字节码文件加载到内存中。

  2. 验证:验证字节码文件的正确性和安全性。

  3. 准备:为静态变量分配内存,并设置默认值。

  4. 解析:将符号引用转换为直接引用。

  5. 初始化:执行静态变量赋值和静态代码块中的代码。

在这个过程中,静态变量会被赋予默认值,比如int类型的默认值为0,boolean类型的默认值为false。如果在静态变量声明时已经赋值,那么会使用该赋值作为默认值。

需要注意的是,静态成员只会被加载一次,而且是在类加载时被加载,而不是在创建对象时被加载。因此,无论创建多少个对象,静态成员只会被加载一次

总的来说,使用了static关键字的静态成员会在类加载时被初始化,并且会被存储在方法区中的静态存储区域中。这个过程是在程序运行时进行的,而不是在编译时进行的。

可以简单理解为static修饰的静态成员在程序运行时优先加载程序中,且只加载一次。

注意:

  • 静态方法可以直接访问类变量和静态方法。

  • 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法。

  • 静态方法中,不能使用this关键字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ヾ草木萤火(≧▽≦*)o

希望大家多多支持,我会继续分享

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

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

打赏作者

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

抵扣说明:

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

余额充值