你知道String类为什么不能被继承吗?

简介: 在找工作面试的时候我们经常会被问到一个问题,那就是String类能被继承吗?为什么?我们都知道String类不能被继承,但为什么不能却不能回答地很完整。

在找工作面试的时候我们经常会被问到一个问题,那就是String类能被继承吗?为什么?我们都知道String类不能被继承,但为什么不能却不能回答地很完整。


今天就分析一下这个问题以及答案!


要想知道这个问题的具体答案,我们首先需要看String的源码(部分):


public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    /** Cache the hash code for the string */
    private int hash; // Default to 0
    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
     public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count <= 0) {
            if (count < 0) {
                throw new StringIndexOutOfBoundsException(count);
            }
            if (offset <= value.length) {
                this.value = "".value;
                return;
            }
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }
复制代码


从String类的源码我们可以看出,该类是被final关键字修饰的,并且String类实际是一个被final关键字修饰的char[]数组,所以实现细节上也是不允许改变,这就是String类的Immutable(不可变)属性。


接着说说为什么String类是被final关键字修饰的所以不能被继承?


在《Java编程思想》中对于final关键字有这样的介绍:


根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
  final类不能被继承,没有子类,final类中的方法默认是final的。
  final方法不能被子类的方法覆盖,但可以被继承。
  final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
  final不能用于修饰构造方法。
  注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
复制代码


通过上述介绍,可以发现final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。


1、当final关键字修饰类时


当一个类被final修饰时,表明这个类不能被继承。被final关键字修饰的类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。


8309a5f2205c4e84b84329a14684b539~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


当我们在开发过程中如果让一个类继承一个被final关键字修饰的类时,编辑器也会报错,"Demo1不能成为最终类FinalClass的子类,请移除FinalClass的final关键字"。


2、当final关键字修饰方法时


当一个方法被final关键字修饰时,则父类的该方法不能被子类所覆盖。《Java编程思想》中提到:


使用final方法的原因有两个。


第一个原因是把方法锁定,以防任何继承类修改它的含义;


第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。


同样如果父类中声明了final修饰的方法,则子类在继承该父类是,如果覆盖该final方法编辑器同样会报错。


11cd3db791834b42ae170fd023086c1d~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


494a97b40cb54a21ae3c69174541a6ba~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


3、当final关键字修饰变量(包括成员变量和局部变量)时


当final关键字修饰变量时,表示该变量是常量,在初始化时便要赋值并且只能被赋值一次,初始化之后不能更改。。如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但是它指向的对象的内容是可变的。


当用final作用于类的成员变量时,成员变量必须在声明时或者构造器中进行初始化赋值,否则会报错,而局部变量只需要在使用之前被初始化赋值即可:


微信截图_20220517210434.png


对于final修饰的变量初始化之后不能更改,如果更改也会报错。

163a4156eded4707946d161034f0aa51~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


1e137edcf92c4d5ca34b5030ceef4f99~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


其实在问String类能否被继承时,不仅仅考察的是对于String源码的理解,还有对于final关键字的掌握。

目录
相关文章
|
1月前
|
索引 Python
模拟实现一个简单的string类
这个示例中,定义了一个简单的 `MyString`类,包含了常用的字符串操作,比如初始化、字符串拼接、长度获取、索引访问、大小写转换、相等判断等功能。请根据需求进行适当的修改和扩展。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
23 5
|
2月前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
47 0
|
8天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
21 1
|
1天前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
11 1
|
5天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
5天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
13 0
|
5天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
15 0
【C++】string学习 — 手搓string类项目
|
8天前
|
C++
【C++】string类(介绍、常用接口)
【C++】string类(介绍、常用接口)
18 2
|
21天前
|
存储 网络协议 Java
Java String类
Java String类
11 0
|
25天前
|
存储 安全 C语言
【C++】string类
【C++】string类