Java 面试高频考点:static 和 final 深度剖析

简介: 本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。



Hey,大家好呀!我是小米,一个积极分享技术的小伙伴!今天我们来聊聊 Java 中的两个非常重要的关键字——static 和 final。虽然这两个关键字在开发中很常见,但是很多人对它们的使用细节和含义可能还有些模糊。别担心,接下来我会用简单易懂的方式,详细为大家剖析它们的用法。

static 关键字

1. static 修饰属性

在 Java 中,static 关键字可以用来修饰类的属性(也叫类变量)。那么,什么是类变量呢?和普通属性有什么区别?

  • 类级别属性:用 static 修饰的属性属于类本身,而不是某个具体的对象。这意味着,不管创建多少个对象,这个静态属性只有一份,所有对象都共享它。
  • 随着类的加载而加载static 属性会在类加载的时候就分配内存空间,不需要等待对象创建。换句话说,静态属性在任何对象实例化之前就已经存在。
  • 先于对象的创建:因为静态属性随着类加载时就存在,所以它的生命周期比普通对象属性长,类加载时它就被创建,类卸载时它才会被销毁。
  • 可以通过类名直接调用:对于静态属性,不需要创建类的实例,可以直接使用类名来调用。

例如:

在上面的例子中,Demo.count 是一个静态变量,可以通过类名 Demo 直接访问,而不需要创建 Demo 类的对象。

2. static 修饰方法

static 关键字同样可以用来修饰方法,这种方法被称为静态方法。

  • 随着类的加载而加载:就像静态属性一样,静态方法也在类加载时创建,无需依赖对象实例化。
  • 可以通过类名直接调用:静态方法可以直接通过类名来调用,而不需要创建该类的实例。
  • 静态方法中只能调用静态成员:在静态方法中,你只能访问类的静态属性和调用其他静态方法,而无法访问实例成员,因为静态方法是在类加载时就存在,而实例成员要等到对象实例化后才能访问。

例如:

  • 不可使用 this 关键字:由于 this 代表当前对象,而静态方法与对象无关,因此在静态方法中不能使用 this

3. 使用场景

  • 静态属性常用于存放与类相关的信息,比如计数器、常量等,所有对象共享一份数据。
  • 静态方法通常用来实现一些工具类或方法库中的函数。例如 Math 类中的 Math.sqrt() 就是一个静态方法。

final 关键字

final 关键字主要有三种用途:修饰变量、修饰方法和修饰类。

1. final 修饰变量

当使用 final 修饰变量时,这个变量的值一旦被初始化后,就不能再修改了。根据数据类型的不同,final 对变量有不同的约束。

(1) 修饰基本数据类型

对于基本数据类型的变量,final 修饰后,它的数值在初始化后就不能更改。例如:

(2) 修饰引用类型

如果 final 修饰的是一个引用类型(比如对象、数组),那么引用本身不能被修改,但引用指向的对象的内容可以更改。例如:

在上面的例子中,虽然我们可以修改 StringBuilder 对象的内容,但不能让 sb 指向另一个新的对象。

2. final 修饰方法

final 关键字可以用来修饰方法,防止子类对该方法进行重写。例如:

  • 防止方法被重写:当父类的方法使用 final 修饰时,子类就不能再重写这个方法。这样可以确保某些核心功能在继承体系中不会被修改。
  • 隐式的 final:需要注意的是,所有的 private 方法都是隐式的 final,因为 private 方法不能被子类访问或重写。

3. final 修饰类

当一个类被 final 修饰时,表示这个类不能被继承。也就是说,final 类中的所有方法都默认是 final 的,子类不能修改其行为。例如:

  • 不能被继承final 类常用于工具类或不希望被继承的类。
  • 私有化构造器:如果不想让类被继承,除了使用 final,还可以通过私有化构造器来实现。私有化构造器可以防止该类被实例化或者继承。

static 和 final 的结合使用

在 Java 中,staticfinal 可以结合使用,用于修饰常量。我们可以用 static final 来声明一个全局常量,这样常量既是类级别的,又是不可修改的。例如:

END

  • static 关键字用于修饰类的属性和方法,它使得这些成员属于类而不是对象,所有实例共享。
  • final 关键字可以用于变量、方法和类,保证这些成员在被修饰后具有不变性,变量不能修改,方法不能被重写,类不能被继承。
  • staticfinal 常一起使用,用于定义常量。

希望通过这篇文章,大家对 Java 中的 staticfinal 关键字有了更深入的理解。如果你有任何问题或者想法,欢迎在评论区留言,我们一起讨论哦!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

相关文章
|
22天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
60 2
|
11天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
35 14
|
27天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
29天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
52 4
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
84 2
|
2月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
32 0
|
4月前
|
存储 安全 Java
这些年背过的面试题——Java基础及面试题篇
本文是技术人面试系列Java基础及面试题篇,面试中关于Java基础及面试题都需要了解哪些内容?一文带你详细了解,欢迎收藏!
|
4月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
4月前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。