## 字节与字符的区别 理解编码的关键,是要把字符的概念和字节的概念理解准确。这两个概念容易混淆,我们在此做一下区分: | 类型 | **概念描述** | **举例** | | --- | --- | --- | | 字符 | 人们使用的记号,抽象意义上的一个符号。 | '1', '中', 'a', '$', '¥', …… | | 字节 | 计算机中存储数据的单元,一个 8 位的二进制数,是一个很具体的存储空间。 | 0x01, 0x45, 0xFA, …… | | ANSI 字符串 | 在内存中,如果“字符”是以**ANSI 编码**形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为**ANSI 字符串**或者**多字节字符串**。 | "中文123" (占7字节) | | UNICODE 字符串 | 在内存中,如果“字符”是以在 UNICODE 中的序号存在的,那么我们称这种字符串为**UNICODE 字符串**或者**宽字节字符串**。 | L"中文123" (占10字节) | **字节与字符区别** 它们完全不是一个位面的概念,所以两者之间没有“区别”这个说法。不同编码里,字符和字节的对应关系不同: | 类型 | **概念描述** | | --- | --- | | ASCII | 一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为 8 位二进制数,换算为十进制。最小值 0,最大值 255。 | | UTF-8 | 一个英文字符等于一个字节,一个中文(含繁体)等于三个字节 | | Unicode | 一个英文等于两个字节,一个中文(含繁体)等于两个字节。符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占 1 个字节的大小,中文句号“。”占 2 个字节的大小。 | | UTF-16 | 一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode扩展区的一些汉字存储需要4个字节) | | UTF-32 | 世界上任何字符的存储都需要 4 个字节 | 参考资料: * [字符,字节和编码 - Characters, Bytes And Encoding](http://www.regexlab.com/zh/encoding.htm) <br> ## 有哪些访问修饰符 Java 面向对象的基本思想之一是封装细节并且公开接口。Java 语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节。访问控制分为四种级别: | 修饰符 | 当前类 | 同 包 | 子 类 | 其他包 | | --- | --- | --- | --- | --- | | public | √ | √ | √ | √ | | protected | √ | √ | √ | × | | default | √ | √ | × | × | | private | √ | × | × | × | * 类的成员不写访问修饰时默认为 default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。 * 受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。 * Java 中,外部类的修饰符只能是 public 或默认,类的成员(包括内部类)的修饰符可以是以上四种。