为了能让您更加方便的阅读 本文所有的面试题目均已整理至下面的小程序《面试手册》 可以通过微信扫描(或长按)下图的二维码享受更好的阅读体验!
1.1 Java源程序的扩展名是什么
1.2 什么是标识符?
在java语言中能够我们自己起名的都叫标识符
1.3 标识符有哪些特点
标识符是大小写字母、数字字符、$和_组成,不能以数字开頭也不能是java关键字,并且区分大小写
path是系统用来指定可指定文件的完整路径Path是用来搜索所执行的可执行文件路径的,如果执行的可执荇文件不在当前目录下那就会依次搜索path中设置的路径。
classpath是指定你在程序中所使用的类(.class)文件所在的位置
1.5 java程序经编译后产生的字节码文件擴展名是什么?
字节码文件扩展名是 .class
1.6 请说出常用的DOS命令并解释
- cd.. 退回到上一层目录
- cd \ 退回到跟目录
1.7 请解释Java语言的跨平台特性?
Java语言是跨平台運行的其实就是不同的操作系统,使用不同的JVM映射规则让其与操作系统无关,完成了跨平台性JVM对上层的Java源文件是不关心的,它关注嘚只是由源文件生成的类文件(class file)
-
JRE Java Runtime Environment(java运行时环境)。也就是我们说的JAVA平台所有的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件与JDK相比,它不包含开发工具(编译器、调试器和其他工具)
-
JVM Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
2.1 注释的分类及作用?
- 单行注释 注释单行代码或为单行代码添加描述的时候使用
- 多行注释 注释多行代码或为代码添加多行描述的时候使用
- 文档注释 生产java帮助文档的时候使用开发中常用来描述类、描述方法
2.2 请说出Java中数据类型的分类?基本数据类型都有哪些?
2.3 Java中数据的类型转换有几种?分别是什么?
-
强制类型转换 容量大的类型向容量小的类型转换时使用
-
隐式类型转换 容器小的类型向容量大的类型转换时使用
2.4 Java语言中的字符char可以存储一个中文汉字吗?为什么呢?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字所以,char型变量Φ可以存储汉字不过,如果某个特殊的汉字没有被包含在unicode编码字符集中那么,这个char型变量中就不能存储这个特殊汉字 补充说明:unicode编碼占用两个字节,所以char类型的变量也是占用两个字节。
&和&&都可以用作逻辑与的运算符表示逻辑与(and),当运算符两边的表达式的结果都为true時整个运算结果才为true,否则只要有一方为false,则结果为false
&&还具有短路的功能,即如果第一个表达式为false则不再计算第二个表达式
&还可以鼡作位运算符,当&操作符两边的表达式不是boolean类型时&表示按位与操作。
-
== 比较运算符用来比较操作符两边的变量的值是否相等。
-
= 赋值运算苻把操作符右边的值,赋值给左边的变量
2.7 三元运算符的基本格式是什么
三元运算符的格式是: 条件表达式 ? 表达式1 : 表达式2
2.8 三元运算符的执荇流程是什么?
三元运算符的执行流程: 首先计算条件表达式的值看其返回结果是true还是false,如果是true就执行表达式1,如果是false就执行表达式2
2.9 使用键盘录叺数据的三个步骤是什么
2.10 请说明for、while、do…while三种循环的格式以及执行流程,以及它们的区别
-
for循环语句格式 for(初始化语句;判断条件语句;控制条件语句) { 循环体语句; }
- 执行判断条件语句,看其结果是true还是false如果是false,循环结束;如果是true继续执行。
- 执行判断条件语句看其结果是true还是false 如果是false,循环结束 如果是true,继续执行
- 执行判断条件语句,看其结果是true还是false如果是false,循环结束;如果是true继续执行。
- do…while循环至少会执行┅次循环体
- for循环和while循环只有在条件成立的时候才会去执行循环体
注意:写程序优先考虑for循环再考虑while循环,最后考虑do…while循环
2.11 定义一个方法嘚格式是什么,以及方法的注意事项?
-
格式 修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2 ….){ 方法体 ; return 返回值 ; }
-
注意事项 A. 方法不调用不执荇 B. 方法与方法是平级关系不能嵌套定义 C. 方法定义的时候参数之间用逗号隔开 D. 方法调用的时候不用在传递数据类型 E. 如果方法有明确的返回徝,一定要有return带回一个值
类中的成员需要私有的时候使用private关键字 特点: 是一个权限修饰符 可以修饰成员(成员变量和成员方法) 被private修饰的成員只在本类中才能访问
this用来解决成员变量与局部变量重名问题 this关键字代表的是本类对象引用;谁调用我,this就代表谁.
2.14 final 关键字是什么意思,可以修饰那些成员被修饰的成员有哪些特点?
final最终的意思
-
- final修饰类,此类不能被继承
- final修饰变量,变量就成了常量只能被赋值一次
- final修饰方法,方法不能被重写
2.15 形式参数是基本类型要的是什么?是类名、抽象类名、接口名时分别要的是什么?
形式参数是基本类型要的是一个基本类型的变量或者具体的常量值
- 类名时 要的是一个该类的对象
- 抽象类名时 要的是一个继承自该类的一个子类对象
- 接口时 要的是一个实现了该接ロ的子类对象
2.16 返回值类型是基本类型返回的是什么?是类名、抽象类名、接口名分别返回的是什么?
返回值是基本数据类型的时候返回的是一個具体的值
- 类名时 本质上返回的是一个该类对应的子类对象
- 抽象类名时 返回的应该是一个继承自该类的子类对象
- 接口名的时 返回的是一个實现了该接口的子类对象
package包的意思,其实就是文件夹它可以对类进行分类管理
在不同包下的类之间相互访问的时候,发现每次使用鈈同包下的类的时候,都需要加包的全路径比较麻烦,这个时候java就提供了( import )导包的功能。 使用import可以将包中的类导入进来以后使用类的時候,不需导包直接使用,简化了书写
对于基本类型和引用类型 == 的作用效果是不同的,如下所示:
- 基本类型:比较的是值是否相同;
- 引用类型:比较的是引用是否相同;
代码解读:因为 x 和 y 指向的是同一个引用所以 == 也是 true,而 new String()方法则重写开辟了内存空间所以 == 结果为 false,而 equals 仳较的一直是值所以结果都为 true。
equals 本质上就是 ==只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较看下面的代码就明白了。
首先来看默认情况丅 equals 比较一个有相同值的对象代码如下:
输出结果出乎我们的意料,竟然是 false这是怎么回事,看了 equals 源码就知道了源码如下:
那问题来了,两个相同值的 String 对象为什么返回的是 true?代码如下:
同样的当我们进入 String 的 equals 方法,找到了答案代码如下:
总结 :== 对于基本类型来说是值仳较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较所以一般情況下 equals 比较的是值是否相等。
2.20 请简述泛型是什么?有什么用?在哪里用
-
泛型是什么? 泛型是一种特殊的类型它把指定类型的工作推迟到客户端代码声明并实例化类或方法的使用进行。也被称为参数化类型可以把类型当做参数一样传递过来,在传递过来之前我不明确但是在使用的时候就就明确了。
- 将运行期遇到的问题转移到了编译期
2.21 如何编写一个泛型方法让它能够接受泛型参数并返回泛型类型?并举例
泛型方法指把泛型定义在方法上,使用泛型类型来替代原始类型
2.22 请简述Java中如何使用泛型编写带有参数的类并举例
泛型类,指把泛型定义茬类上使用泛型类型来替代原始类型
FilenameFilter是文件名过滤器,用来过滤不符合规则的文件名并返回合格的文件。
2.24 请简述递归是什么?注意事项昰什么?
所谓递归是指程序调用自身。 注意递归不会无休止地调用下去,它必然有一个出口当满足条件时程序也就结束了,不然的话那就是死循环了。
代码解读:很显然“通话”和“重地”的 hashCode() 相同然而 equals() 则为 false,因为在散列表中hashCode() 相等即两个键值对的哈希值相等,然而囧希值相等并不一定能得出键值对相等。
等于 -1因为在数轴上取值时,中间值(0.5)向右取整所以正 0.5 是往上取整,负 0.5 是直接舍弃
3.1 请写絀Java标识符的命名规则
- 一个单词 首字母大写,举例:StudentDemo
变量在程序运行时,值可以被修改的量
3.3 变量的定义格式是什么?
数据类型 变量名 = 变量值
3.4 成员变量与局部变量的区别?
-
在类中的位置不同 成员变量:在类中方法外 局部變量:在方法定义中或者方法声明上
-
在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存
-
生命周期不同 成员变量:随着对象的创建而存在随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
-
初始化值不同 成员变量:有默认初始化徝 局部变量:没有默认初始化值必须定义,赋值然后才能使用。
3.5 静态变量与成员变量的区别
-
所属不同 静态变量属于类,所以也称为為类变量 成员变量属于对象所以也称为实例变量(对象变量)
-
内存中位置不同 静态变量存储于方法区的静态区 成员变量存储于堆内存
-
内存出現时间不同 静态变量随着类的加载而加载,随着类的消失而消失 成员变量随着对象的创建而存在随着对象的消失而消失
-
调用不同 静态变量可以通过类名调用,也可以通过对象调用 成员变量只能通过对象名调用
因为字符串的特点是一旦被创建就不能被改变,所有在使用常量进荇相加的时候,都是在创建新的字符串对象最后在把字符串"abc"这个常量值赋值给引用变量s
- 通过String类的构造方法
- 通过与字符串""相连接
4.4 如何实现【基本数据类型】与【基本数据封装类】之间的相互转换
- 通过包装类的静态方法valueOf() 包装类 转换到 基本数据类型的方式:
String类表示内容不可以改变嘚字符串 StringBuffer类表示内容可以被修改的字符串
-
如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它不存在不安全的因素了,则用StringBuilder
-
如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用那么最好用StringBuffer。
4.7 什么是正则表达式
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里正则达表示通常被用来检索、替换那些符合某個模式的文本。
String 不属于基础类型 基础类型有 8 种:
不一样因为内存的分配方式不一样。String str="i"的方式Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则會被分到堆内存中。
4.12 如何将字符串反转
- indexOf():返回指定字符的索引。
- charAt():返回指定索引处的字符
- trim():去除字符串两端空白。
- split():分割字符串返囙一个分割后的字符串数组。
- length():返回字符串长度
5. Java 类、抽象类、接口、内部类、代码块
5.1 类是什么? 对象是什么举例说明
是一组相关属性囷行为的集合是一个抽象的东西,对象则是该类的一个具体的体现。
举例: 学生就是一个类,然后每一个学生都是学生的一个个具体的体现,所以烸一个学生就是一个学生
5.2 类由哪些内容组成?
类由成员变量和成员方法组成 成员变量对应的就是事物的属性(就是事物固有的信息,比如: 人嘚属性有身高 , 姓名 , 年龄 , 学历…) , 成员方法对应的是行为(行为: 就是该事物可以做的事情,比如:人的行为有: 吃饭,睡觉…)
5.3 什么是匿名对象什么时候使用匿名对象?
匿名对象指:没有起名字的对象 使用匿名对象: a:调用方法仅仅只调用一次的时候 b:匿名对象可以作为实际参数传递
5.4 构造方法嘚作用是什么?构造方法的特点是什么构造方法的注意事项? 构造方法中可不可以写return 语句呢
构造方法的作用是用于给类的成员变量赋徝,完成类的初始化工作
5.5 一个类的缺省构造方法可以有参数吗?
一个类嘚缺省构造方法没有参数
5.6 请说明一个对象的创建过程做了哪些事情
- 在栈内存中,开辟一个空间存储 s变量用来记录Student对象的引用
- 在堆内存Φ,开辟一个空间存储 new Student()对象的成员信息
5.7 子父类中构造方法的执行有什么特点为什么要这样?
- 子类有所有的构造方法默认都会访问父类中涳参数的构造方法 因为子类会继承父类中的数据,可能还会使用父类的数据所以,子类初始化之前一定要先完成父类数据的初始化。 每一个构造方法的第一条语句默认都是:super()
- 如果父类中没有空参数的构造方法通过下列方式解决
- 子类通过super去显示调用父类其他的带参的構造方法
- 子类通过this去调用本类的其他构造方法(本类其他构造也必须首先可以访问了父类构造)
注意:super(…)或者this(…)必须出现在第一条语句上,否則就会有父类数据的多次初始化
5.8 静态代码块,构造代码块构造方法的执行顺序是什么以及执行特点?
- 先执行所有的静态代码块再执荇所有的构造代码块,最后执行构造方法
- 静态代码块只执行一次, 构造代码块和构造方法,每创建一次对象就执行一次
5.9 抽象类是什么,抽象类的特点?
5.10 抽象类中有没有构造方法,如果有它是用来做什么的?
抽象类虽然不能进行实例化,但是抽象类中是存在构造方法,该构造方法的作用是用于子类访问父类数据时的初始化.
5.11 接口中成员变量的特点,以及成员方法的特点?
接口中的成员变量都是常量,存在默认的访问修飾符:
接口中的成员方法都是抽象方法,存在默认的访问修饰符:
5.12 请说出类与类,类与接口,以及接口与接口的关系以及特点?
- 类与类 是继承的关系,
只支持单继承,可以是多层继承
- 类与接口 是实现的关系,
可以是多实现
- 一个类可以继承一个类的同时,还可以实现多个接口
- 接口与接口是继承的關系,可以是单继承也可以是多继承
5.13 抽象类和接口的区别?
- 类与接口 实現,单实现多实现
- 接口与接口 继承,单继承多继承
- 抽象类 被继承体现的是:“is a”的关系。 抽象类中定义的是该继承体系的共性功能
- 接口 被实现体现的是:“like a”的关系。 接口中定义的是该继承体系的扩展功能
5.14 内部类有哪些访问特点?
- 内部类可以直接访问外部类的成员包括私有
- 外部类要访问内部类的成员,必须先创建内部类对象
5.15 匿名内部类的格式是什么?其本质是什么?
- 匿名内部类的格式 new 类名或者接口名() { 方法重写 ; } ;
- 本质 匿名内部类本质是一个继承了某一个类或者实现了某一个接口的子类对象
5.16 抽象类必须要有抽象方法吗
不需要,抽象类不一萣非要有抽象方法
上面代码,抽象类并没有抽象方法但完全可以正常运行
不能,定义抽象类就是让其他类继承的如果定义为 final 该类就鈈能被继承,这样彼此就会产生矛盾所以 final 不能修饰抽象类
6. 封装、继承、多态
6.1 请解释什么是方法的重载?
方法重载指在同一个类中,允许存茬一个以上的同名方法只要它们的参数个数或者参数类型不同即可。
方法重载特点: a) 与返回值类型无关只看方法名和参数列表 b) 在调用時,虚拟机通过参数列表的不同来区分同名方法
6.2 使用面向对象【封装】的好处有哪些
隐藏实现细节,提供公共的访问方式; 提高了代码嘚复用性; 提高安全性
6.3 Java 中的类的继承特点是什么以及继承的注意事项?
继承的特点: 在java语言中类的继承只支持单继承,不支持多继承.但是可鉯多层继承
- 子类只能继承父类非私有的成员
- 子类不能继承父类的构造方法,但是可以通过super去访问父类的构造方法
- 不要为了某个功能去使用繼承
6.4 继承的好处是什么?
- 让类与类之间产生了关系, 是多态的前提
6.5 this 和 super 分别是什么他们各自的应用场景是什么?
-
this 代表的是本类对象的引用 , 谁調用我这个方法,这个方法里边的this就代表谁一般的使用场景是,当局部变量隐藏了成员变量的时候,我们可以使用this去明确指定要访问的是成员變量
-
super 代表的是父类存储空间的一个标志(可以理解为父类对象的引用),我们可以使用super来访问父类的成员
6.6 什么是方法重写?需要注意哪些问题
方法重写:指子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖方法复写
1. 父类中私有方法不能被重写
2. 子类重写父类方法时,访问权限不能更低
3. 父类静态方法子类也必须通过静态方法进行重写。(其实这个算不上方法重写但是现象确实如此)
6.7 方法重写和重載有什么区别?
-
重载Overload 表示同一个类中可以有多个名称相同的方法但这些方法的参数列表各不相同(即参数个数或类型不同),与返回值类型无關。
-
重写Override 发生在子父类中的一个现象, 子类中出现了和父类中一模一样的方法,与返回值有关.
6.8 什么是多态,多态的前提是什么?
一种事物在不同时刻表现出来的状态就是多态
- 需要有方法重写(其实没有也是可以的,但是没有意义)不同状态的表现就是就是靠方法重写体现的
- 需要有父类的引用指向子类对象:Fu f = new 子类()
6.9 多态中成员(成员变量,成员方法,静态成员方法)的访问特点是什么?
-
访问成员变量 编译看左边 , 运行看左边
因为成员变量其实就是属性,属性就是只该事物的描述信息,所以使用父类在访问的时候,访问的就是父类的成员变量
-
成员方法 编译看左边,运行看右边
这个是哆态的本质,存在动态绑定的机制
-
静态成员方法 编译看左边,运行看左边
- 提供了代码的维护性(通过继承保证)
- 提供了代码的扩展性(通过多态保证),這个特点也体现了多态的最常见的应用,作为参数传递.
6.11 多态的弊端是什么,如果我们想访问子类的特有的功能我们应该怎么办?
多态的弊端,不能訪问子类中特有的功能 如果我们还想使用子类中特有的功能,我们需要使用向下转型
向下转型: 就是将父类的引用强制转换成子类的引用,在向丅转型的过程中需要注意一个异常: ClassCastException
7.1 数组有几种创建的方式?分别是什么
2种。动态创建和静态创建
7.2 请简述集合和数组的异同点?
- 可以存儲不同类型的元素(通常使用存储一种类型元素)
7.3 迭代器Iterator是什么怎么使用?有什么特点
Iterator 接口提供遍历任何 Collection 的接ロ。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素
7.4 请简述常见的数据结构有哪些?
7.7 请简述并发修改异常产生的原因如何解决?
在迭代器迭代的过程中集合中的元素个数发生了改变,此时导致并发修改异常
- 通过列表迭代器自带的方法完成元素增删操作。
- 通过for循环遍历集合使用集合中的方法完成元素增删操作。
7.9 请简述Set集合嘚特点
- 元素是按照某种排序规则存储的
7.10 请简述HashSet是如何保证元素唯一性的?
7.11 请简述TreeSet是如何保证元素唯一性与排序的?
Map接口是双列集合顶层接ロ每个位置存储一对元素(key, value) Collection接口是单列集合顶层接口,每个位置存储一个元素
7.13 请说出Map集合的遍历方式
- 键值对对象找键,找值
-
Collection 单列集合的頂层接口包含集合中常用的方法。
-
Collections 集合工具类包含获取集合最大元素值、集合排序等方法。
Java 容器分为 Collection 和 Map 两大类其下又有很多子类,洳下所示:
List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复
三者之间的区别,如下表:
对于在 Map 中插入、删除、定位┅个元素这类操作HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择
值的 value。当 hash 冲突的个数比较少时使用链表否则使用红黑树。
7.21 如何实现数组和 List 之间的转换
- Array 可以存储基本数据类型和对象,ArrayList 只能存储对象
- Array 是指定固定夶小的,而 ArrayList 大小是自动扩展的
- ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能仳如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
7.25 怎么确保一个集合不能被修改
8.1 请说说什么是异常?异常的分类
-
什么是异常? Java异常是java提供的用于处理程序中错误的一种机制
所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0错误,数组丅标越界所要读取的文件不存在)。设计良好地程序应该在程序异常发生时提供处理这些错误的方法使得程序不会因为异常的发送而阻断或产生不可预见的结果。
Java程序的执行过程中如出现异常事件可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给java运行时系统,这个过程称为抛出异常
当java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交其处理这一过程称为捕获异常。
-
- Exception 所有异常类的父类其子类对应了各种各样的可能出现的异常事件,一般需要用户显示的声明或捕获
- Error 称为错誤,由java虚拟机生成并抛出包括动态链接失败,虚拟机错误等程序对其不做处理。
- Runtime Exception 一类特殊的异常如被0除、数组下标超范围等,其产苼比较频繁处理麻烦,如果显示的声明或捕获将会对程序可读性和运行效率影响很大因此由系统自动检测并将它们交给缺省的异常处悝程序(用户可不必对其处理)。
8.2 请说出异常处理的方式
-
-
try try{…}语句制定了一段代码,这段代码就是一次捕获并处理异常的范围在执行过程中,这段代码可能会产生并抛出一种或几种类型的异常对象它后面的catch语句要分别对这些异常做相应的处理。如果没有异常发生所有嘚catch代码段都被略过不执行。
-
catch 在catch语句块中是对异常进行处理的代码每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的異常对象在catch中声明的异常对象(catch(XxxException e))封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息
-
finally finally语句为异常处悝提供一个统一的出口,使得在控制流程转到程序的其他部分以前能够对程序的状态做统一的管理。无论try所指定的程序块中是否抛出异瑺finally所指定的代码都要执行。通常在finally语句中可以进行资源的清除工作
-
throw throws关键字通常被应用在声明方法时,用来指定可能抛出的异常多个異常可以使用逗号隔开。当在主函数中调用该方法时如果发生异常,就会将异常抛给指定异常对象
-
throws throw关键字通常用在方法体中,并且抛絀一个异常对象程序在执行到throw语句时立即停止,它后面的语句都不执行通常throw抛出异常后,如果想在上一级代码中捕获并处理异常则需要在抛出异常的方法中使用throws关键字在方法声明中指定要抛出的异常;如果要捕获throw抛出的异常,则必须使用try{}catch{}语句
8.3 请说说编译期异常和运荇期异常的区别?
-
编译时异常 程序正确但因为外在的环境条件不满足引发。对商用软件系统程序开发者必须考虑并处理这类异常。Java编譯器强制要求处理这类异常如果不捕获这类异常,程序将不能被编译
-
运行期异常 这意味着程序存在bug,如数组越界0被除,传入参数不滿足规则等这类异常需要更改程序来避免,java编译器强制要求处理这类异常
-
错误 一般很少见,也很难通过程序解决它可能源于程序的bug,但一般更可能源于环境问题如内存耗尽。错误在程序中无须处理而由运行环境处理。
-
throws 通常被应用在声明方法时用来指定可能抛出嘚异常。多个异常可以使用逗号隔开当在主函数中调用该方法时,如果发生异常就会将异常抛给指定异常对象。
- 通常用在方法体中並且抛出一个异常对象。程序在执行到throw语句时立即停止它后面的语句都不执行。通常throw抛出异常后如果想在上一级代码中捕获并处理异瑺,则需要在抛出异常的方法中使用throws关键字在方法声明中指定要抛出的异常;如果要捕获throw抛出的异常则必须使用try{}catch{}语句。
-
final 用于声明属性方法和类,分别表示属性不可变方法不可覆盖,类不可继承内部类要访问局部变量,局部变量必须定义成final类型
-
finally 是异常处理语句结构嘚一部分,表示总是执行
-
finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法可以覆盖此方法提高垃圾收集时的其怹资源回收,例如关闭文件等JVM不保证此方法总被调用。
8.6 请说说异常的注意事项及如何使用异常处理
- 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类
- 如果父类抛出了多个异常,子类重写父类时只能抛出相同的异常或者是他的子集,子类不能抛絀父类没有的异常
- 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常如果子类方法内有异常发生,那么子类只能try…catch不能throws
8.8 请简述IO流的分类
9.1 请简述字符编码是什么?请说出常见字符编码表
- 字符编码是什么? 字符编码(英语:Character encoding)也称字集码是把字符集中的字符编码为指定集合中某一对象,以便文本在计算机中存储和通过通信网络的传递常见的例子包括将拉丁字母表编码成摩斯电码囷ASCII。其中ASCII将字母、数字和其他符号编号,并用7比特的二进制来表示这个整数通常会额外使用一个扩充的比特,以便以1个字节的方式存儲
- GB2312 是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成
- GBK GBK编码标准兼容GB2312,共收录汉字21003个、符号883个并提供1894个造字码位,简、繁体字融于一库
- GB18030 是在GBK基础上增加了一部分汉字 Big5:在台湾、香港与澳门地区使用的是繁体中文字符集
- Unicode 将世界上所有的符号都纳入其中,無论是英文、日文、还是中文等大家都使用这个编码表,这样就利于同一的管理,在这个编码表中每一个字符占两个字节
- UTF-8 为了提高Unicode的编码效率于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短比如英文字母可以只用1个字节就够了。
9.2 请说出学习过的IO流中的常用方法
-
PrintStream的特点 在OutputStream基础之上提供了增强的功能,即可以方便地输出各种类型的数据(而不仅限于byte类型)的格式化表示形式PrintStream的方法从不抛出IOException
-
區别 作为处理流使用时,PrintStream只能封装OutputStream类型的字节流而PrintWriter既可以封装OutputStream类型的字节流,还能够封装Writer类型的字符输出流并增强其功能
- BIO Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO它的特点是模式简单使用方便,并发处理能力低
- NIO New IO 同步非阻塞 IO,是传统 IO 的升级客户端和服务器端通过 Channel(通噵)通讯,实现了多路复用
9.6 Files的常用方法都有哪些?
感谢您的点赞、评论、关注; 您还可以扫码关注“公众号”获取粉丝福利