Java学习基础和总结三

1.为什么java中只有值传递?

  • 按值调用:表示方法接收的是调用者提供的值。
  • 按引用调用:表示方法接收的是调用者提供的变量地址。
  • 一个方法可以修改传递引用所对应的变量值,而不能修改值传递调用所对应的变量值。
  • Java程序设计总是采用按值调用,对象引用也是按值传递的。
  • 结论:
    • 一个方法不能修改一个基本数据类型的参数(数值型或布尔型)。
    • 一个方法可以改变一个对象参数的状态。
      • 方法得到是对象引用的拷贝,对象引用以其他拷贝同时引用一个对象。
    • 一个方法不能让对象参数引用一个新的对象。

2.简述线程、程序、进程的基本概念。以及他们之间的关系是什么?

  • 程序:程序是含有指令和数据的文件,被存储在磁盘或者其他数据存储设备中,也就是说程序的静态代码。
  • 进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序从创建、运行到消亡的过程。一个进程就是一个执行中的程序。线程是进程划分成的更小的运行单位。线程和进程最大的区别就是各进程之间基本是独立的,线程之间是一般是相互影响的。进程属于操作系统范畴,而线程则是属于同一程序范畴。
  • 线程:线程是一个比进程更小的执行单位。一个进程在其执行过程中可以产生多个线程。同类的多个线程共享一个内存空间和一组系统资源。所以系统在产生一个线程或是各个线程之间切换工作时,负担要比进程小的多,所以线程也被称为轻量级进程。

3.线程有哪些基本状态?

线程一般有六种状态:创建、运行中(就绪、运行)、阻塞、等待、超时等待、终止。

  • 创建(NEW):线程被创建,但是没有调用start()方法。
  • 就绪(READY):调用start()方法,但是还没有获取到时间片。
  • 运行(RUNNING):线程调度程序将处于就绪状态的线程设置为当前线程,此时进入运行状态。开始运行run()方法中的代码。
  • 等待(WAITING):当线程执行wait()方法之后,线程就进入了等待状态。今天等待状态的线程需要依靠其他线程的通知才可以回到运行状态。
  • 超时等待(TIME_WAITING):相当于在等待状态的基础上增加了超时限制。当时间达到后线程将会返回到阻塞状态。
  • 阻塞(BLOCKED):当线程调用同步方法时,没有获取到锁的情况下,线程会进入到阻塞状态。
  • 终止(TERMINATED):线程在执行完run()方法之后,就会进入到终止状态。

4.什么是反射机制?反射机制的应用场景?

  • Java反射机制是在运行状态中:
    • 对于任意一个类,都能知道这个类的所有属性和方法;
    • 对于任意一个对象,都能调用它的任意一个方法和属性;
    • 这种动态获取信息以及动态调用对象方法的功能叫做反射。
  • 静态编译:在编译时确定类型,绑定对象。
  • 动态编译:在运行时确定类型,绑定对象。
  • 优点:运行期类型的判断,动态加载类,提高代码灵活度。
  • 缺点:性能瓶颈,反射相当于一系列的解释操作,通知JVM要做的事情,性能比直接的java代码要慢很多。
  • 应用场景:反射是框架设计的灵魂。
    • 基本很少直接使用反射机制。
    • 模块化开发,通过反射调用对于的字节码。
    • 动态代理设计模式也采用了反射机制。
    • 日常使用的Spring框架,大量的使用到了反射机制。

4.Java中的异常处理?

  • Java异常类层次结构图(图片来自JavaGuide)Java学习基础和总结三
  • 所有的异常都有一个共同的祖先Throwable类。有两个重要的子类Exception(异常)和Error(错误),两个都Java异常处理的子类,各自包含大量的子类。
  • Error(错误):是程序无法处理的错误,表示应用程序中较严重的问题。
  • Exception(异常):即程序本身可以处理的异常。
  • 异常处理总结:
    • try:用于捕获异常。其后可接零或者多个catch块,如果没有catch块,必须跟一个finally块。
    • catch:用于处理try捕获的异常。
    • finally:无论是否捕获到异常,finally块中的语句都会执行。当try或者catch块中遇到return是,finally在方法返回之前被执行。
    • finally不会执行的特殊情况:
      • 在finally语句块的第一行发生异常。其他行还是会得到执行。
      • 在前面的代码中用了System.exit(int)。
      • 程序所在的线程死亡。
      • 关闭CPU。
    • 注:当try语句和finally语句中都有return语句时,在方法返回之前,finally语句的内容将被执行,并且finally中的返回值会覆盖原有返回值。

5.Java序列化中,如果有的字段不想被序列化,应该怎么办?

  • 对于不想进行序列化的变量,使用transient关键字修饰
  • transient关键字的作用是:阻止实例中使用该关键字修饰的变量序列化;当对象反序列化时,被transient修饰的变量不会被持久化和恢复
  • transient只能修饰变量,不能修饰方法和类。

6.深拷贝和浅拷贝?

  • 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容。
  • 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝。就是复制对象的引用地址。