阿里P6面试题及答案( 二 )


类可以实现很多个接口,但是只能继承一个抽象类
类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的 。
抽象类可以在不提供接口方法实现的情况下实现接口 。
Java接口中声明的变量默认都是final的 。抽象类可以包含非final的变量 。
Java接口中的成员函数默认是public的 。抽象类的成员函数可以是private,protected或者是public 。
接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化 。
也可以参考JDK8中抽象类和接口的区别
10.什么是值传递和引用传递?
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身。
一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递
11.进程和线程的区别是什么?

【阿里P6面试题及答案】进程是执行着的应用程序,而线程是进程内部的一个执行序列 。一个进程可以有多个线程 。线程又叫做轻量级进程 。
线程与进程的区别归纳:
a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享 。某进程内的线程在其它进程不可见 。
b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性 。
c.调度和切换:线程上下文切换比进程上下文切换要快得多 。
d.在多线程OS中,进程不是一个可执行的实体 。
12.创建线程有几种不同的方式?你喜欢哪一种?为什么?
有4种方式可以用来创建线程:
继承Thread类
实现Runnable接口
应用程序可以使用Executor框架来创建线程池
实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类 。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口 。同时,线程池也是非常高效的,很容易实现和使用 。
还有一种方式是实现Callable接口
13.概括的解释下线程的几种可用状态 。
1. 新建( new ):新创建了一个线程对象 。
2. 可运行( runnable
):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法 。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权。
3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ),执行程序代码 。
4. 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice,暂时停止运行 。直到线程进入可运行( runnable
)状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态 。阻塞的情况分三种:
(一). 等待阻塞:运行( running )的线程执行 o . wait ()方法,JVM 会把该线程放 入等待队列( waitting queue )中 。
(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中 。
(三). 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long
ms )或 t . join
()方法,或者发出了 I / O 请求时,JVM 会把该线程置为阻塞状态 。当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable
)状态 。
5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期 。死亡的线程不可再次复生 。
14.同步方法和同步代码块的区别是什么?
区别:
同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
同步方法使用关键字
synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;
15.在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
监视器和锁在Java虚拟机中是一块使用的 。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块 。每一个监视器都和一个对象引用相关联 。线程在获取锁之前不允许执行同步代码 。


推荐阅读