Java面试(四)

遇到过异常吗,如何处理?
在java中,可以按照如下三个步骤处理异常:
1.捕获异常
将可能发生异常的代码块包裹在try内部,当业务代码中发生任何异常时,系统都会为此异常创建一个异常对象。创建异常对象后,JVM会在try块后寻找可以处理它的catch块,把这个异常对象交给这个catch块来处理
2.处理异常
在catch块中处理异常时,应该先记录日志,便于以后追溯这个异常。然后根据异常的类型、结合当前的业务情况,进行相应的处理
3.回收资源
如果业务代码块打开了某个资源,比如数据库链接,网络链接和磁盘文件等,需要在业务代码执行完毕后关闭这个资源。并且无论是否发生异常都一定要关闭,把关闭的代码写在finally里面,因为finally是必须执行的

说一说java的异常机制
关于异常处理:
在java中,异常锤了的语句由try、catch、finally三部分组成,其中try包裹的是业务代码块,catch用于捕获并且处理某个异常的类型,finally用于回收资源。当业务代码发生异常时,系统会创建一个异常对象,然后由JVM寻找可以处理这个异常的catch块,并把这个异常对象交给catch处理。若业务代码打开了某项资源,则可以在finally中关闭这项资源

关于抛出异常:
当程序出现错误的时候,系统会自动抛出异常。除此之外,java也允许程序主动抛出异常。当业务代码块中判断某项错误条件成立的时候,可以手动throw关键字向外抛出异常。在这种情况下,如果当前方法不知道该如何处理这个异常,可以在方法签名上通过throws关键字声明异常,把该异常交给JVM处理

关于异常跟踪栈:
程序运行时,经常会发生一系列方法调用,从而形成方法调用栈。异常机制会导致异常在这些方法之间传播,而异常传播的顺序和方法的调用相反。异常从异常发生的方向向外传播。首先传给该方法的调用者,再传给上层调用者,以此类推最终传给main方法。若依然没有得到处理则JVM会终止程序,并打印异常跟踪栈的信息

介绍Java的异常接口
Throwable是异常的顶级父类,代表所有非正常情况。它有两个直接子类:Error和Exception

Error:它是错误,是java虚拟机无法解决的严重问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误是无法恢复或不可能捕获的,会导致应用程序中断。通常应用程序无法处理这些错误,所以不应该使用catch来捕获Error对象

Exception:它是异常,被分为两大类:Checked异常和Runtime异常
所有的RuntimeException及其子类被称为Runtime异常(运行时异常);不是RuntimeException类和其子类则被称为Checked异常(编译异常)。Java 认为Checked异常都是可以被处理的异常,所以java程序必须显示处理Checked异常,如果不处理编译是不会通过的。Runtime异常可以使用trycatch实现

finally是无条件执行吗?
不管try中的代码块是否出现异常,也不管catch是不是被执行,甚至在这两者中出现了return语句,finally总是被执行的

finally中return会发生什么?
在通常情况下,不要再finally中使用return、throw等导致方法终止的语句,一旦使用这些语句会导致try、catch中的return、throw语句失效

对static关键字的理解
在java类中只能包含成员变量、方法、构造器、初始化代码块、内部类(包括接口、枚举)五种成员,而static可以修饰成员变量、方法、初始化块、内部类。以static修饰的成员就是类成员,类成员属于整个类而不是单一一个对象

对static关键字而言,有一个很重要的规则:类成员是不能访问实例成员的。因为类成员是属于类的,类成员的作用域比实例成员的作用域更大,完全可能出现类成员已经初始化完成,但是实例成员还不曾初始化的情况

类变量的内存布局:
jdk8以前认为在方法区的静态域中,jdk8在堆,总而言之是被对线共享的(同一个类对象),static类变量在类加载的时候就生成了

类什么时候被加载?
1.创建实例对象(如new)
2.创建子类对象,父类也会被加载
3.使用类的静态成员时

对final的理解
以下情况可以使用final:
1.当不希望类被继承,可以用final修饰
2.当不希望父类某个方法被子类重写,用final修饰
3.当不希望类的某个属性被修改,用final修饰
4.当不希望某个局部变量被修改,可用final修饰
注意事项和使用细节
1.final修饰的属性又叫常量
2.final修饰的属性在定义的时候,必须赋初始值,并且以后不能修改,赋值的位置可以是:1.定义时 2.构造器中 3.代码块中
3.若final修饰的属性是静态的,那么赋值位置只能是:1.定义式 2.静态代码块
4.final类不能被继承,但是可以实例化对象
5.若类不是final类,但是含有final方法,那么该方法虽然不能被重写,但是可以被继承
6.一般来说final类不需要final方法(有点画蛇添足)
7.final不能修饰构造器
8.final往往和static搭配使用,效率高,不会导致类加载
9.包装类、String类也是final类

static和final有什么区别?
static关键字可以修饰成员变量、成员方法、初始化块和内部类,被static修饰的成员是类的成员,它属于类,不属于单个对象。以下是static修饰这4种成员时表现出的特征:
1.类变量:被static修饰的成员变量叫类变量(静态变量)。类变量是属于类的,它随类的信息存储在方法区,不随对象存储在堆中,类变量可以通过类名来访问,也可以通过对象访问,建议通过类名访问
2.类方法:被static修饰的成员方法叫类方法(静态方法)。类方法属于类,可以通过类名访问也可以通过对象访问,建议使用前者
3.静态块:被static修饰的代码块。静态代码块属于类,在类加载的时候被隐式diaoyl一次,之后就不会被调用了
4.静态内部类:被static修饰的内部类叫静态内部类。静态内部类可以包含静态成员,也可以包含非静态成员。静态内部类不能访问外部类的实例成员,只能访问外部类的静态成员。外部类的所有方法、初始化块都可以访问其定义的静态内部类

final关键字可以修饰类、方法、变量
1.final类:不可以被继承
2.final方法:不可以被重写
3.final变量:一旦获得了初始值就不可以被修改

对泛型的理解
java集合有一个缺点,把一个对象丢进集合里后,集合会忘记这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了Object(运行类型没变)
java集合之所以被设计成这样,是因为设计者不知道我们用集合来保存什么类型的对象,只要求集合具有良好的通用性。但是会带来两个问题:
1.集合对元素没有任何限制,可能会发生一些问题,如保存Dog对象但是丢入了Cat对象,可能会发生异常
2.由于把对象丢进集合的时候,集合只知道装的是Object类型,取出集合元素后通常还需要进行强制类型转换,这种转换增加了变成的复杂度,也可以引发ClassCaseException异常
从Java5开始,Java引入了“参数化类型”的概念,允许创建集合的时候指定元素类型,参数化类型就被称为泛型

List<? super T> 和 List<? extends T>的区别?
?是类型通配符,List<?>可以表示各种泛型List的父类,意思是元素类型未知的List
List< ? super T > 用于设定类型通配符的下限,此处?代表一个未知的类型,但它必须是T的父类
List< ? extends T > 用于设定类型通配符的上限,相同的?必须是T的子类

说说对java反射机制的理解
java程序中对象在运行的时候可以表现为两种类型,也就是编译类型和运行时类型。如 Person p = new Student();
有时,程序在运行的时候接到外部传入的一个对象,该对象编译类型是Object,但程序有需要调用该对象运行时类型的方法,这就要求程序在运行时候发现对象和类的真实信息,可以有两种做法:
1.在编译时和运行时都完全知道类型的具体信息,在这种情况下,可以先使用instanceof运算符进行判断,再利用强制类型转换把其转成运行时类型的变量即可
2.在编译时根本无法预知该对象和类可能属于哪些类,程序只一考运行时的信息来发现该对象和类的真实信息,这就需要反射

通过反射,可以实现如下操作:
1.程序运行时,可以通过反射获得任意一个类的Class对象,通过这个Class对象查看这个类的信息
2.程序运行时,可以通过反射创建任意一个类的实例,并访问该实例的成员
3.程序运行时,可以通过反射机制生成一个类的动态代理类或动态代理对象

java反射在实际运用有哪些场景?
1.使用JDBC时,如果要创建数据库的连接,则需要先通过反射机制来加载数据库的驱动程序
2.多数框架都支持注解/XML配置,从配置中解析出的类是字符串,需要通过反射机制来实例化
3.面向切面编程(AOP)的实现方案,是在程序运行时创建目标对象的代理类,这必须由反射机制来实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值