其他面试题:
目录
三、Java 中 Exception 和 Error 有什么区别?
一、java中的序列化和反序列化是什么?
思维导图
回答:
序列化就是将对象转换为字节流的过程,反序列话就是将字节流转换为对象的过程,也就是序列化的逆过程,主要应用在网路传输、远程调用、持久化存储和分布式系统数据交换当中。java要想实现对象的序列化需要实现Serializable接口,底层实现序列化是用到了ObjectOutputStream这个类,而反序列化则是用到了ObjectInputStream这个类。
serialVersionUID的作用是什么?
就是一个版本号的作用,来确保数据在序列化的过程中被修改而导致不一致的问题,在序列化的时候判断UID是否跟当前对象的UID一致,如果一致就说明当前对象没有被其他线程修改过,此时可以继续序列化,其本质就是一个乐观锁。
transient关键字有什么用?
这个关键字可以标记在不想被序列化的字段上,确保不被序列化。
二、什么是java的不可变类?
思维导图
回答:
不可变类就是创建后其状态,也就是对象的字段无法被修改的类。一般是通过final关键字去创建一个不可变类,最常见的例子就是String字符串,String被创建后其值不可变,假设有s+='a',也只是创建了一个新对象,并将s的引用指向了新对象,s的旧引用指向的老对象的值没有变化还是s。
不可变类主要有线程安全、缓存友好等优点,但是也有缺点例如性能问题,当执行了过多的字符串操作,可能会创建大量字符串对象,浪费内存空间。
三、Java 中 Exception 和 Error 有什么区别?
思维导图
回答:
从定义上来讲,Exception是指程序能够处理的异常情况,而Error则是JVM层次内系统级的错误,一般程序不能够处理。Exception和Error的共同之处就是都是Throwable类的子类,java代码只有继承了Throwable类的实例才能被throw或catch。
四、你觉得java的优势是什么?
思维导图
回答:
我觉得java的优势有跨平台性、垃圾回收、生态、面向对象四个优势。
其中跨平台性主要体现在,java代码被编译成字节码,然后被不同平台下的JVM编译成对应平台的机器码并交由对应平台执行,从而实现跨平台性,这也就是java“一次编译,到处运行”的原因。
java内部的JVM有内存回收机制,极大地减少了程序员内存管理的成本。
java有丰富的第三方类库和成熟的开发框架以及各种中间件。
java还是一种面向对象的语法,其封装继承多态的特性也使得java可扩展性强。
五、什么是java的多态特性?
思维导图
回答
多态的定义是:同一个接口或父类引用变量可以指向不同的对象实例,并根据实际指向的对象类型执行相应的方法。
多态还分为编译时多态和运行时多态,编译时多态主要体现为方法重载,方法重载就是同一个类中可以定义多个同名方法,但参数列表不同,java编译器会根据传入的参数来决定调用哪一个方法。
运行时多态体现为方法重写,方法重写就是子类重写父类中的一个或多个方法。通过父类引用调用方法时,实际上执行的是子类重写后的方法。
六、java中的参数传递是按值还是按引用?
java中的参数传递都是值传递,其中基本数据类型传递的是值,引用数据类型传递的是地址值。
七、为什么java不支持多重继承?
因为不想走C++的老路,C++支持多重继承,这就导致在继承过程中可能会出现歧义的情况,具体如下:
D继承B和C(多重继承),B和C共同继承A,A的方法在B和C中都得到重写,在D想调用A中方法时,因为B和C都有不同的实现,此时就会出现歧义,不知道应该调用哪个了。
八、面向对象编程和面向过程有什么区别?
面向对象是以对象作为编程指导或中心,通过对象间的交互操作来实现具体的功能,最直观的表现就是封装继承多态,数据和行为封装在一个对象中。
面向过程就是以函数作为编程指导或中心,通过函数间的调用来实现具体的功能,数据和行为是分开的。
面向对象更加模块规范化,且扩展性强,但是开发难度高,适合大型项目。
面向过程更加直接,但扩展性弱,维护成本高,不易协作,适合小型项目快速开发。
九、Java 方法重载和方法重写之间的区别是什么?
首先方法重载就是在同一个类中允许有多个重名方法,但是参数列表不同(个数、顺序、类型),通过传进来的参数来调用对应的方法。而方法重写就是字类去重写父类的方法,为该方法提供新的实现或扩展。
方法重载的参数列表,返回类型都可以不一样,但是方法重写的参数列表和返回类型都必须和父类的保持一致。而且子类方法的访问修饰不能比父类更严格且不能抛出比父类更多的异常,也就是子类要一直生活在父类的阴影下。
十、什么是java内部类?
内部类是指在一个类的内部定义的类。
成员内部类:可以访问外部类的所有成员
静态内部类:可以访问外部类的静态成员
局部内部类:定义在方法或代码块中,仅在代码块或方法中可见,通常用于临时的对象构建
匿名内部类:没有类名的内部类,通常用于创建短期使用的对象实例,尤其是在接口回调或者事件处理时被广泛使用。