java基础问题3

57.什么是反射?
答:可以将一个程序(类)在运行的时候获得该程序(类)的信息的机制,也就是获得在编译期不可能获得的类的信息,因为这些信息是 保存在Class对象中的,而这个Class对象是在程序运行时动态加载的

58.什么是 java 序列化?什么情况下需要序列化?
答:系列化就是把java对象转换为字节序列的方法。
(1)永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
(2)通过序列化以字节流的形式使对象在网络中进行传递和接收;
(3)通过序列化在进程间传递对象;
参考

59.动态代理是什么?有哪些应用?

答:动态代理是运行时动态生成代理类。代理类并不是在Java代码中定义的,
而是在运行时根据我们在Java代码中的“指示”动态生成的。
https://www.cnblogs.com/gonjan-blog/p/6685611.html
应用:Spring 的 AOP
在业务中使用动态代理,一般是为了给需要实现的方法添加预处理或者添加后续操作,但是不干预实现类的正常业务,把一些基本业务和主要的业务逻辑分离。我们一般所熟知的Spring的AOP原理就是基于动态代理实现的。
60.怎么实现动态代理?

答:JDK动态代理基于JDK的动态代理就需要知道两个类:1.InvocationHandler(接口)、2.Proxy(类)
cglib动态代理
1.引入CGLIB的jar包

2.创建代理类

public class CGsubject {
public void sayHello(){
System.out.println(“hello world”);
}
}
如果直接对这个类创建对象,那么调用sayHello方法,控制台就会输出hello world,现在我们还是要对输出添加前置和后置的log输出。来打印输出前和输出后的时间。

3.实现MethodInterceptor接口,对方法进行拦截处理。

https://blog.csdn.net/qq_32532321/article/details/81874990
五、对象拷贝

61.为什么要使用克隆?

答: new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。而clone在第一步是和new相似的, 都是分配内存,调用clone方法时,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。
有一个对象 A,在某一时刻 A 中已经包含了一些有效值,此时可
能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中的值,也就是说,A 与 B 是两个独立
的对象,但 B 的初始值是由 A 对象确定的。

62.如何实现对象克隆?

答:实现 Cloneable 接口并重写 Object 类中的 clone() 方法。
实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

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

答:浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。
https://blog.csdn.net/zhangjg_blog/article/details/18369201

74.throw 和 throws 的区别?

答:
throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。

throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。用来声明一个方法可能抛出的所有异常信息
throw是具体向外抛异常的动作,所以它是抛出一个异常实例。

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

答:
final 是用来修饰类、方法、变量
finally 只能用在 try catch 语法中,表示这段语句最终一定会被执行
finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。
特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。 使用finalize还需要注意一个事,调用super.finalize();
一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。

76.try-catch-finally 中哪个部分可以省略?

答:try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同时省略,也就是说有 try 的时候,必须后面跟一个 catch 或者 finally

77.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

答:一定会, catch 中 return会等finally中的代码执行完之后才会执行

78.常见的异常类有哪些?

NullPointerException 空指针异常
ClassNotFoundException 指定类不存在
IndexOutOfBoundsException 数组下标越界异常

NumberFormatException 字符串转换为数字异常

ClassCastException 数据类型转换异常

FileNotFoundException 文件未找到异常

NoSuchMethodException 方法不存在异常

IOException IO 异常

SocketException Socket 异常

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值