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[];

我们可以看到String类由Java关键字final所修饰,那么final关键字又是干什么的呢?

简单来说,final关键字可以修饰类,方法,变量。final修饰类,该类不能被继承;final修饰方法,该方法不能被重写;final修饰变量,该变量如果是基本变量则值不能再被改变,如果是引用变量则引用地址不能改变,该值可以改变。

明确了final关键字的定义,我们就可以清楚的了解String类是不能被继承的。

那么Java的设计者为什么要这么设计呢?

  1. 为了实现字符串池。

字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现,因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。

2.为了线程安全。

String的不可变性也有线程安全的作用。同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。String是线程安全的

3.为了实现String可以创建HashCode的不可变性.

这点我们可以比较容易想到,因为字符串是不可变的,所以在它创建的时候HashCode值就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。
代码示例:

//这里HashMap存放Key的位置用String就是因为他的不可变性
Map<String,Object> map = new HashMap<>();

但是String真的不可变吗?

String的确是个不可变类,但是Java有强大的反射机制可以改变
代码示例:

	@Test
    void testString01() {
        Field field = null;
        String name = "CodeGAP";
        System.out.println(name);
        try {
            field = String.class.getDeclaredField("value");
            field.setAccessible(true);//目的让我们在用反射时访问私有变量
            char[] newName = (char[])field.get(name);
            newName[0] = 'A';
            System.out.println(name);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

执行结果:
CodeGAP
AodeGAP

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
专题一:计算机系统知识 1 1、计算机硬件基础知识: 1 1.1计算机系统结构 1 1.2 计算机中的编码: 3 1.3存储器系统 8 1.4中央处理器CPU 15 1.5 输入/输出系统 17 1.6 计算机总线结构 19 1.7 体系结构其他的知识 19 1.8 计算机的安全、可靠性评价 * 24 1.9 数学基础知识 28 1.9.1命题逻辑的基础知识 28 1.9.2 谓词逻辑、形式逻辑基础知识 31 1.9.3排列组合、概率论应用、应用统计 34 1.9.4线性规划 37 专题二:程序语言部分 39 1、程序语言知识 39 1.1 程序语言: 39 1.2 汇编语言: 42 1.3 解释程序: 42 1.4 编译程序: 43 2.重点与难点 45 2.1文法及语言形式描述: 45 2.2 词法分析 46 2.3 语法分析 47 2.4代码优化 48 专题三:操作系统知识 53 1、操作系统知识: 53 1.1基本概述 53 1.2 处理机管理 55 1.3进程概念: 55 1.4存储管理 58 1.5设备管理: 61 1.6文件和文件系统 62 1.7 作业管理与用户界面 64 1.8操作系统的结构 64 1.9常用操作系统 67 2.重点与难点: 68 2.1进程相关的概念: 68 2.2信号量处理: 69 2.3各种调度算法: 69 专题四:多媒体专题 71 1、多媒体知识: 71 1.1多媒体知识概述 71 1.2图形和图像 73 1.3音频 74 1.4视频 76 1.5数据压缩和编码技术标准 77 2 多媒体重点和难点 79 专题五:计算机网络知识 81 1、计算机网络知识 81 1.1计算机网络知识概述: 81 1.2网络协议和架构模型: 82 1.3网络操作系统: 83 1.4局域网技术 84 1.5广域网技术 85 1.6 Internet/Intranet/Extranet 86 1.7 C/S与B/S结构 87 1.8网络安全性: 88 1.9网络应用: 89 1.10网络管理 89 1.11 信息化基础知识 90 专题六: 数据库知识 99 1、数据库知识 99 1.1数据管理技术的发展 99 1.2数据模型 100 1.3数据库系统的结构 101 1.4关系模型和关系运算 101 1.5关系数据库SQL语言 104 1.6 数据库设计 106 1.7关系数据库规范化理论 106 1.8数据库保护 108 1.9数据仓库与分布式数据库 113 2.数据库重点和难点: 118 2.1 数据库管理系统(DBMS) 118 2.2 SQL语句 119 2.3 关系运算 119 2.4关系范式: 121 专题七:软件工程专题 122 1、软件工程知识 122 1.1概述 122 1.2软件分析 124 1.3软件设计 125 1.4软件测试 128 1.5软件开发工具与环境(CASE) 129 1.6软件维护和软件管理 130 1.7面向对象技术 133 1.7.1面向对象的基本概念 133 1.7.2面向对象的分析方法 135 1.7.3面向对象设计方法 136 1.8软件质量(重点) 137 1.8.1八项质量管理原则 138 1.8.2十三个步骤: 140 1.9软件配置管理 140 1.10软件过程改进 142 专题八:知识产权和标准化知识 146 1 标准化的基本知识 146 1.1标准化的基本概念 146 1.2标准化原理: 147 1.3标准的分类 148 1.4标准的代号和编号 151 1.5国际标准和国外先进标准 154 1.6标准化组织 156 1.7 ISO9000标准简介 160 1.8能力成熟度模型CMM简介 162 2 知识产权基础知识: 166 2.1知识产权介绍 166 2.2 计算机软件保护条例: 169 专题九:数据结构知识 173 1. 数据结构概述 174 2. 常用数据结构 175 2.1线性表 175 2.2 栈 178 2.3队列 181 2.4 串 184 2.5 数组 185 2.6 树 189 2.6.1概述 189 2.6.2二叉树 190 2.7图 192 3. 数据结构相关算法 195 3.1排序算法 195 3.2查找算法 211 4 重点、难点解析 212 专题十:算法分析与设计 214 1.常用的算法设计方法: 214 1.1 迭代法: 214 1.2 穷举搜索法: 215 1.3 递推法: 217 1.4 递归法 218 1.5 贪婪法 224 1.6 分治法 227 1.7 动态规划法 229 1.8 回溯法 234 1.9 分支定界法: 235 2.几个重要的算法程序 235 2.1 堆排序 235 2.2 归并排序 237 专题十一: 系统工程知识 239 1.系统与系统工程: 239 1.1 系统的概念: 239 1.2系统的分类 239 1.3系统的特性 239 1.4系统与环境 240 1.5系统工程与系统方法 240 1.6信息系统工程 240 2.系统分析基础知识 241 2.1系统分析的目的和任务 241 2.2结构化分析方法 241 2.3统一建模语言(UML) 243 2.4系统规格说明书 245 3.系统设计基础知识 245 3.1系统设计目的和任务 245 3.2结构化设计方法和工具 245 3.3系统总体结构设计 245 3.4系统详细设计 246 3.5系统设计说明书 247 4.系统实施知识 248 4.1系统实施的主要任务 248 4.2结构化程序设计、面向对象程序设计、可视化程序设计 248 4.3系统测试的目的、类型,系统测试方法 248 4.4系统转换基础知识 249 5.系统运行和维护知识 249 5.1系统运行管理基础知识 249 5.2系统维护基础知识 250 5.3系统评价基础知识 250 专题十二: JAVA程序设计语言 251 1 Java和面向对象概述 255 2 Java概述 256 2.1 安装并配置Java 平台 257 2.1.1 Java平台概述 257 2.1.2 Java平台的安装 257 2.2 第一个Java Application程序 257 2.2.1 编辑源程序 257 2.2.2 字节码的编译生成 259 2.2.3 字节码的解释与运行 259 2.3 使用集成开发环境 259 3 Java语言基础 260 3.1 Java程序的构成 260 3.2关键字、标识符、数据类型、常量与变量 261 3.2.1 关键字 261 3.2.2 标识符 261 3.2.3 数据类型 261 3.2.4 常量与变量 262 3.3 运算符 263 3.3.1 算术运算 264 3.3.2 关系运算 264 3.3.3 位运算 264 3.3.4 类型转换 265 3.3.5 其他运算符 266 3.3.6 运算符的优先级与结合性 267 3.4 流程控制语句 267 3.4.1 结构化程序设计的三种基本流程 267 3.4.2 选择结构 267 3.4.3 循环结构 268 3.4.4 跳转语句 269 4 类和对象 270 5 继承 272 6 字符、字符串、数组 274 6.1 字符 275 6.1.1 Character类的构造函数 275 6.1.2 Character类提供的常用方法 275 6.2 字符串 275 6.2.1 字符串常量与String类 276 6.2.2 字符串变量与StringBuffer类 278 6.3 数组 279 6.3.1 数组的创建和初始化 279 6.3.2 数组的数组 280 6.3.3 复制数组 280 6.3.4 数组类Arrays 280 6.3.5 命令行参数 281 7 图形用户界面的设计与实现 281 7.1图形用户界面概述 282 7.2 图形用户界面 282 8 Applet 286 8.1 Applet的基本工作原理 286 8.2 Applet类与JApplet类 287 8.2.2 Applet与Application的区别 288 8.3 Applet安全基础 288 8.4 向Applet传递参数 289 8.5 Application与Applet组合 289 8.6 Applet与JAR文件 290 8.6.1 JAR文件概述 290 8.6.2 jar命令 290 8.6.3 JAR缓存 290 9 Java高级编程 291 9.1异常处理 291 9.2 Java多线程机制 295 9.3 流式输入输出与文件处理 295 9.3.1 Java输入输出类库继承关系 296 9.3.2基于标准输入输出的IO操作 296 9.3.3文件读写及随机访问 297 9.3.4Java的文件管理 297 9.4 Java网络通信 297 9.4.1网络基础知识及Java网络模型 298 9.4.2无连接的数据报 298 9.4.3 Java访问网络资源 298

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值