面试题库之JAVA基础篇(三)

final 
  1. 被final修饰的类不可以被继承。
  2. 被final修改的方法不可以被重写。
  3. 被final修改的方法,jvm会尝试内联,以提高运行效率。
  4. 被final修改的变量不可变,如果修改的是引用,那么引用不可变,引用指向的对象内容可变。
  5. 被final修饰的常量,在编译期间,会存入常量池中。 
static 
  1. 静态修饰符。
  2.  可修饰变量、方法、代码块(多用于初始化操作)、内部类、导包。
  3. 静态变量、静态方法、静态常量统称为类的静态成员。静态成员归整个类所有,不属于某个单一的对象,而是被类的所有实例对象共享。
  4. 局部变量不能被声明为静态变量。
  5. 静态方法不能访问非静态成员。
  6. 静态方法中不能使用this和super关键字。
  7. 静态方法不能被重写,但可以被继承。
  8. 抽象方法不能使用static进行修饰。
abstract 
  1. 抽象修饰符,只能用来修饰类和方法。
  2. 不能修饰私有方法、静态方法、final方法和final类。
  3. 抽象类中不一定包含抽象方法,但有抽象方法的类必须是抽象类。
  4. 抽象类中可以有0~n个抽象方法,也可以有0~n个具体方法。
  5. 抽象类不能被实例化,一般是由子类进行实例化完成相关操作,声明抽象类的目的主要是为了对该类进行扩展。
  6. 抽象方法只有方法的声明,但没有方法体。
  7. 继承抽象类时,必须重写父类中所有的抽象方法,除非自己也是抽象类。
  8. 面向抽象编程使得调用者只须关心抽象方法的定义,而不必关心子类的具体实现。
异常 
  1. 运行时异常(RuntimeException):RuntimeException及其子类,编译器不会检查,属于不可预知的异常。如:ClassCastException,NullPointerException。
  2. 被检查的异常(CheckedException)::Exception本身,以及Exception子类(除运行时异常外)都属于被检查的异常。可以理解为编译器会检查的异常,那么通过throw进行申明抛出,要么通过try-catch捕获处理。如:IOException。
  3. 错误(Error):Error类及其子类,当资源不足、约束失败、或是其他程序无法继续运行的条件发生时,就会产生错误,程序本省无法修复这些错误。如:OutOfMemoryErro,ThreadDeat。
try-catch-finally  
  1. try 块负责监控可能出现异常的代码。
  2. catch 块负责捕获可能出现的异常,并进行处理。
  3. finally 块负责清理各种资源,不管是否出现异常都会执行。
  4. 其中 try 块是必须的,catch 和 finally 至少存在一个标准异常处理流程。 
finally 
  1.  不管有没有异常,finally模块中的代码都会执行。
  2. 当try和catch中有return时,finally任然会执行。
  3. return的值是在finally执行前确定的。
  4. finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。 
序列化和反序列化
  1. 序列化:将结构数据或对象转化成二进制字节流的过程,便于网络传输或存储。
  2. 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程。
serialVersionUID
  1. 用于标识序列化类版本的字段,当一个类实现了Serializable接口,说明这个类时可以被序列化的,编译器会自动生成一个serialVersionUID字段,表示该类的版本号。
  2. 当反序列化时,jvm会根据serialVersionUID进行版本检查,如果被反序列化数据的版本号跟当前对象的serialVersionUID不一致,则会抛出InvalidClassException,防止反序列化操作成功。
  3. serialVersionUID 允许不同版本的类在一定程度上兼容。当反序列化旧版本的对象时,如果新版本的类中删除了某些字段或方法,Java 虚拟机会忽略这些字段或方法,而不会引发异常。
  4. 如果需要序列化对象,建议手动显示的定义serialVersionUID。
transient 

         将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。

反射机制
  1. 概念:在运行时能够动态获取类信息和动态调用对象的机制。程序运行时,可以获取任意一个对象所属的类(Class),可以创建任意一个类的对象(Constructor),可以获取任意一个类的属性和方法,可以调用任意一个对象的属性和方法。
  2.  获取类方式:Class.forName(类路径)、类名.class、对象名.getClass()、基本类型的包装类.type。
  3. 优点:提高程序的灵活性。
  4. 确定:反射需要解析字节码,性能较低;相对不安全,破坏了封装性,因为反射可以获取对象的私有属性和方法。
浅拷贝

         新对象和旧对象的成员变量的值一致,引用变量指向的也是同一个对象。

深拷贝 

         新对象和旧对象的成员变量的值一致,新对象中的引用变量指向的对象也是被复制了新对象。

程序、进程、线程
  1. 程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
  2. 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。
  3. 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
Object的常用方法 
  1. clone:保护方法,实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法,否则抛出CloneNotSupportedException 异常,深拷贝也需要实现 Cloneable,同时其成员变量为引用类型的也需要实现 Cloneable,然后重写 clone 方法。 
  2. finalize:该方法和垃圾收集器有关系,判断一个对象是否可以被回收的最后一步就是判断是否重写了此方法。
  3. equals:一般 equals 和 == 是不一样的,但是在 Object 中两者是一样的。子类一般都要重写这个方法。
  4. hashCode:该方法用于哈希查找,重写了 equals 方法一般都要重写 hashCode 方法,这个方法在一些具有哈希功能的 Collection 中用到,一般必须满足 obj1.equals(obj2)==true 。可以推出 obj1.hashCode()==obj2.hashCode() ,但是hashCode 相等不一定就满足 equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
  5. wait:配合 synchronized 使用,wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。调用该方法后当前线程进入睡眠状态直到被唤醒、被中断、超时。
  6. notify:配合 synchronized 使用,该方法唤醒在该对象上等待队列中的某个线程(同步队列中的线程是指抢占 CPU 的线程,等待队列中的线程是指等待唤醒的线程)。
  7. notifyAll:配合 synchronized 使用,该方法唤醒在该对象上等待队列中的所有线程。

你可能感兴趣的:(JAVA面试题库,面试,java,职场和发展)