Java面试题总结-Day3
Java面试题总结-Day3
1 面向过程和面向对象的区别
1.1 面向过程
- 优点: 性能方面比面对对象高,因为类调用时需要实例化,开销比较大.
- 缺点: 没有面向对象易维护,易复用,易扩展.
1.2 面向对象
- 优点: 易维护,易复用,易扩展,由于面向对象有封装,继承,多态的特性,可以设计出低耦合的系统,使系统更加灵活,更加易于维护.
- 缺点: 性能比面向过程低.
2 什么是字节码?采用字节码的最大好处是什么?
- Java引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器.这台虚拟的机器在任何平台上都提供给编译程序一个共同的接口.
- 编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行.在Java中,这种提供虚拟机理解的代码叫字节码(即扩展名为
.class
的文件),它不面向任何特定的处理器,只面向虚拟机.
- 每种平台的解释器是不同的,但是实现的虚拟机是相同的.Java源程序经过编译器编译后变成字节码,字节码由虚拟机送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行.这也解释了Java的编译和解释并存的特点.
- Java源代码->编译器->JVM可执行的Java字节码(即虚拟指令)->jvm->jvm中的解释器->机器可执行的二进制机器码->程序运行.
- 字节码的好处:
- 一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言的可移植的特点.
- 由于字节码不专对一种特定的机器,因此,Java程序无需重新编译便可在不同的计算机上运行.
3 构造器Constructor是否可被override
- 父类的私有属性和构造方法并不能被继承,所有构造方法不可以被重写.
4 Java面向对象的三大特性
4.1 封装
- 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法.
4.2 继承
- 子类拥有父类非private的属性和方法.
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展.
- 子类可以用自己的方式实现父类的方法.
4.3 多态
- 程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,在程序运行期间才确定.
- Java中有两种形式可以实现多态
- 继承(多个子类对同一方法的重写)
- 接口(实现接口并覆盖接口中同一方法)
5 在Java中定义一个无参构造函数方法的作用
- Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中"无参构造方法".
- 如果父类中只定义了有参的构造方法,而子类的构造方法中又没有用super()来调用父类的特定的构造方法,则编译时将发生错误.
6 简述线程,程序,进程的基本概念.以及它们之间的关系是什么?
6.1 线程
- 线程与进程相似,但线程是一个比进程更小的执行单位.
- 一个进程在其执行期间可以产生多个线程.
- 多个线程共享同一块内存空间和系统资源,所以线程之间切换工作时,负担要比进程小得多.
6.2 进程
- 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.
- 系统运行一个程序即是一个进程的创建,运行到消亡的过程.进程就是一个执行中的程序.
- 每个进程还占有某些系统资源如CPU时间,内存空间,文件,输入输出设备的使用权等
- 线程和进程最大的不同是在于基本山各个进程是独立的,而各线程则不一定.
6.3 程序
- 是含有指令和数据的文件,被存储到磁盘或其他数据存储设备中,也就是说程序是静态的代码.
7 线程有哪些基本状态?这些状态是如何定义的?
- 新建(new): 新创建了一个线程对象
- 可运行(就绪态)(runnable): 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运行线程池中,等待线程调度选中,获取cpu的使用权.
- 运行(running): 可运行状态(runnable)线程获得了cpu时间片(timeslice),执行程序代码.
- 阻塞(block): 阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行.直到线程进入可运行状态(runnable),才有机会再次获得cpu timslice 转到运行状态(running).
- 等待阻塞: 运行(running)的线程执行
o.wait()
方法,JVM会把该线程放到等待队列(waiting queue)中.
- 同步阻塞: 运行(running)的线程执行在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock poll)中.
- 其他阻塞: 运行(running)的线程执行
Thread.sleep(long ms)
或 t.join()
方法,或者发出了I/O请求时,JVM会把该线程设置为阻塞状态.当上面的状态处理完毕时,线程重新转入可运行(runnable)状态.
- 死亡(dead): 线程run(),main()方法执行结束,或者因异常退出run()方法,则该线程结束生命周期,死亡的线程不可再次复生.
Date: 2018-11-02 10:28
Author: devinkin
Created: 2018-11-02 五 11:24
Validate