java面试12题(一)

java面试12题(一)


1. 为什么java被称作“平台无关的编程语言”?

答:java语言是所以跨平台,是因为java编译后的.class字节码文件是跨平台的;java字节码文件经过java虚拟机解释成对应平台的机器码执行;所以java的跨平台就是在不同的平台上安装了java虚拟机(JVM)。


2. 什么是java虚拟机(JVM)?

答:java虚拟机就是可以执行java字节码的虚拟机进程。


3.JDK和JRE的区别

答:jdk是java开发工具包,jre是java运行时环境;
jdk包含jre,可以让开发者开发、编译、运行java应用程序。
jre包含java虚拟机、java核心类和其他支持文件。


4. static关键字的四种用法

答:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问;方便在没有创建对象的情况下来进行调用(方法/变量)。
static主要有四种用法:

  1. 修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
  2. 修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
  3. 静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
  4. 静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。

5. java中是否可以覆盖private方法或是static方法?

答:java的static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。
java中也不能覆盖private方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他类继承当前类是不鞥访问到private变量和方法的。所以能覆盖。


6. 是否可以在static环境中访问非static变量?

答:不可以在 static 环境中访问非 static 变量。
因为 static 成员是在类被加载时被加载的,而非 static 成员则是在类被实例化时创建的,只能通过实例进行访问。
当在 static 环境中访问非 static 成员时,此时实例很可能还没有被创建,所以不能访问非 static 成员。所以在 static 环境中不可访问非 static成员。


7. java支持多继承吗?

答:java的类只支持单继承,不支持多继承;但是java的接口支持多继承;
接口可以扩展多个功能,当类实现接口的时候,类就可以扩展对应的功能。


8. 什么是自动装箱拆箱?

答:自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。
自动装箱就是Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转化为Integer,自动拆箱是Integer调用其方法将其转化为int的过程

Java支持的数据类型包括两种:
一种是基本数据类型,包含byte,char,short, boolean ,int , long, float,double;
另一种是引用类型:如String等,其实是对象的引用,JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中,通过地址来找到堆中的对象的过程,即为引用类型。


9. 什么是值传递、引用传递?

答:值传递是针对基本数据类型的变量来说的,传递的只是该变量的副本,改变副本的值不会改变原来变量的值;
引用传递是针对引用类型变量来说的,传递的是对象的地址,同一个地址指向两个的变量,所以两个变量的值都相同,会被同时发生变化。


10. 进程和线程的区别

答:进程是执行的应用程序,线程是进程内部的执行序列,
一个进程可以有多个线程,线程又叫轻量级进程。

线程和进程的区别归纳:

区别 进程 、 线程
a. 地址空间和其他资源: 进程之间相互独立;同一进程的线程间共享 某进程的线程不能再其他进程中看见。
b. 通信 进程间通信ICP,线程间可以直接读写进程数据段来进行通信,需要进程同步和互斥手段的辅助,来保护数据的一致性。
c. 调度和切换 线程的上下文切换比进程上下文切换快得多。
d. 在多线程的OS中,进程不是一个可执行的实体

11. 创建线程有几种不同的方式?哪一种比较受欢迎?为什么?

答:有三种方式:
①继承Thread类
②实现Runnable接口,并重写里面的run方法。
③使用Executor框架创建线程池。
一般情况下,常见的是第二种。

  • Runnable接口有如下好处:
    ①避免点继承的局限,一个类可以继承多个接口。
    ②适合于资源的共享

继承于Thread类的线程类,可以直接调用start方法启动线程(使用static也可以实现资源共享).一个线程(对象)只能够执行一次start(),而且不能通过Thread实现类对象的run()去启动一个线程。

实现Runnable接口的类需要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。

Executor框架是juc里提供的线程池的实现。调用线程的start():启动此线程;调用相应的run()方法
线程的使用的话,注意锁和同步的使用。(多线程访问共享资源容易出现线程安全问题)


12. 方法重载和方法覆盖是什么意思?

答:方法重载是发生在一个类中,方法的名称相同,但是参数的个数和类型不同;方法覆盖是说子类重新定义父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。
注意:只有返回值类型不同的方法不算重载

猜你喜欢

转载自blog.csdn.net/Xxacker/article/details/85106307