Java常见的部分面试题及解析

这搜集的一些比较常见的面试题,这次罗列出来主要解析一下:
(1)final 在 java 中有什么作用?
(2)普通类和抽象类有哪些区别?
(3)抽象类能使用 final 修饰吗?
(4)接口和抽象类有什么区别?
(5)深拷贝和浅拷贝区别是什么?
(6)throw 和 throws 的区别?
(7)final、finally、finalize 有什么区别?
(8)try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
(9)常见的异常类有哪些?

1.final 在 java 中有什么作用?
1、final修饰类:表示该类不能被继承
2、修饰方法:表示方法不能被重写
3、修饰变量:表示变量只能一次复制以后值不能被修改(常量)
就比如说再定义一个变量时,在前面被final修饰过之后,这个变量就变成一个常量了,不能够被修饰。
例如:final修饰基本数据类型时的内存示意图:请添加图片描述
当final修饰的是一个基本数据类型数据时, 这个数据的值在初始化后将不能被改变; 当final修饰的是一个引用类型数据时, 也就是修饰一个对象时, 引用在初始化后将永远指向一个内存地址, 不可修改. 但是该内存地址中保存的对象信息, 是可以进行修改的。
final修饰引用数据类型的示意图:
请添加图片描述
不难看出final修饰变量的本质: final修饰的变量会指向一块固定的内存, 这块内存中的值不能改变.
引用类型变量所指向的对象之所以可以修改, 是因为引用变量不是直接指向对象的数据, 而是指向对象的引用的. 所以被final修饰的引用类型变量将永远指向一个固定的对象, 不能被修改; 对象的数据值可以被修改.

2.普通类和抽象类有哪些区别?
关键点:abstract修饰符(抽象方法)、具体实现过程、实例化、子类实现父类的抽象方法

普通类中不可含有抽象方法,可以被实例化;
抽象类,则抽象类中所有的方法自动被认为是抽象方法,没有实现过程,不可被实例化;抽象类的子类,除非也是抽象类,否则必须实现该抽象类声明的方法

普通类和抽象类之间有abstract的区别,普通类不会被abstract修饰,并且普同类可以被实例化
在这里插入图片描述
抽象的方法我们是通过继承来加以实现的,可以看出图中代码很明显的区别,抽象方法都必须通过继承的方法来进行实现,不然会出现错误。
抽象类是先定义好所有的内容,然后通过子类来加以实现,其实这种方法的好处也很明显,我们在父类中定义好了所有的抽象方法,然后我们能够很清晰的知道这个大的父类主要是做什么项目的,就相当于给人一个目录的感觉,具体内容我们写到子类里面去实现,就像一本书一样,父类给好了目录,然后子类里面是每一个故事。

3.抽象类能使用 final 修饰吗?
不能。
定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类。
很简单的原理,final,最终的意思,意味着就把一个物件想成一件永恒不变的东西了,所以说他既不能被继承,也不能被修改。

4.接口和抽象类有什么区别?
首先接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。

人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.就相当于吃东西这是口腔进入的第一道工序,接下来是肠胃等,接下来的这些东西就是抽象类,来实现完整的吃东西这个动作。

所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
就是两者的作用范围是不同的。

第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。

当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的

5.深拷贝和浅拷贝区别是什么?

浅拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针,不复制堆内存中的对象。

请添加图片描述
深拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针和堆内存中的对象。
请添加图片描述

6.throw 和 throws 的区别?
throw:
表示方法内抛出某种异常对象
如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译报错
执行到 throw 语句则后面的语句块不再执行
throws:
方法的定义上使用 throws 表示这个方法可能抛出某种异常
需要由方法的调用者进行异常处理
即向上抛,本级解决不了的事就给父类解决,最终给jvm来解决
请添加图片描述

这块报出的是空指针异常

7.final、finally、finalize 有什么区别?

final:

final修饰类,表示该类不可以被继承
final修饰变量,表示该变量不可以被修改,只允许赋值一次
final修饰方法,表示该方法不可以被重写

finally:

finally是java保证代码一定要被执行的一种机制。
比如try-finally或try-catch-finally,用来关闭JDBC连接资源,用来解锁等等
就是无论是否,finally语句都是一定会执行的,就算finally前有return 语句,仍然会执行的

finalize:

finalize是Object的一个方法,它的目的是保证对象在被垃圾收集前完成特定资源的回收。
不过finalize已经不推荐使用,JDK9已经标记为过时。
三者的作用域并不相同,三者都有各自的用法,并没有相同之处

8.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
请添加图片描述
这段代码很明显可以看出finally仍然会执行。

9.常见的异常类有哪些?
(1)NullPointerException 当应用程序试图访问空对象时,则抛出该异常,即空指针异常。
(2)SQLException 提供关于数据库访问错误或其他错误信息的异常。
(3)IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
(4)NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
(5)FileNotFoundException当试图打开指定路径名表示的文件失败时,抛出此异常。
(6)IOException当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。
(7)ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常。
(8)ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。
(9)IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
(10)ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
(11)NegativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。
(12)NoSuchMethodException无法找到某一特定方法时,抛出该异常。
(13)SecurityException由安全管理器抛出的异常,指示存在安全侵犯。
(14)UnsupportedOperationException当不支持请求的操作时,抛出该异常。
(15)RuntimeExceptionRuntimeException 是那些可能在Java虚拟机正常运行期间抛出的异常的超类。
这是平常列举的十五个异常类,大家在面试前可以好好看一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值