您的位置:首页 > 职场人生

201个核心Java面试问题汇总(1)

2017-03-12 16:15 183 查看

基础部分:

1.JVM,JDK,JRE之间的区别?

JVM是Java虚拟机的首字母缩写,它是一种提供了Java字节码运行时环境的规范。JVM,JRE和JDK都是平台相关的,这是因为它们在不同平台(OS)上的配置是不一样的,但是Java是平台(OS)无关的。JVM对很多的软件和硬件平台都适用(比如语言无关性的创建,只关注字节码的操作),JVM的主要任务:加载,验证,运行,提供运行时环境。

JRE是JVM的实现,它是物理存在的,包含了JVM,libraries(jar包)和其他的一些JVM在运行时会用到的文件。

JDK是Java Development Kit的首字母缩写,它也是物理存在的,JDK是JRE+一些开发工具(javac,Javap)。

上面我们可以看出三者间的层次结构。

2.JVM的内存分配区有几种类型?



看图说话,上图是Java虚拟机的内部架构,包含三部分:类加载器,内存区,执行引擎。在这我们只关注中间的部分。

Class Area:存储了每个class的结构:比如运行时常量池,字段和方法的数据,方法的code。

Heap:存放对象的运行时数据。

Stack:Stack以帧存储,它存储local变量和部分结果,在invoke和return的时候起作用。每个线程都有一个Stack,与创建线程同时。一个新的帧在一个方法invoke的时候创建,在invoke结束的时候丢弃这个帧。

程序计数器:它保存了Java虚拟机正在执行的指令的地址。

本地方法栈:它存储了APP中使用的所有的本地方法(Native method)。

3.什么是JIT编译器?

JIT编译器是提升性能的。JIT编译字节码中部分在相同时间内功能相同的部分,因此可以减少编译是所需时间。这里”编译器“表示将JVM指令集装换为CPU指令集的转换器。

4.什么是平台(platform)?

平台是程序运行所需的基础的硬件或者软件环境环境,两种类型:基于硬件的和基于软件的。Java提供的平台是基于软件的。

5.Java平台和其他平台有什么不一样?

java平台是建立在其它基于硬件的平台的顶层的基于软件的平台架构,它有两部分组成:运行时环境和APP的接口。

6.什么性质给予了”Java一次编译,到处运行“的特性?

字节码。Java是被编译成字节码,字节码是介于Java源码和机器码之间的一种中间语言,这种字节码与平台无关,因此可以用于任何平台。

7.什么是类加载器?

类加载器是JVM的子系统,用于加载类和接口,有许多种类的类加载器。Bootstrap classloader, Extension classloader, System classloader, Plugin classloader etc.

8. .java文件名是有效的文件吗?是的。

9.delete,next,main,exit or null是关键字吗?不是。

10.如果在命令行不提供任何参数,那么main的String[]是空的还是null?是空的,但是不是null。

11.如果我使用static public void代替public static void可以吗?可以,编译和运行不会出现任何问题。

12.局部变量的默认值是多少?局部变量不会初始化为任何默认值,无论是原始数据类型还是对象引用都是如此。

面向对象的概念:

13.面向对象程序语言和基于对象程序语言的区别?

基于对象程序语言沿用了OOPS语言的所有特性处理除了继承。基于对象的语言有JavaScript, VBScript。

14.被定义为一个实例变量的对象引用的初始值是多少?Java中的对象引用初始化为null.

15.什么是构造器?构造器用来初始化一个对象的状态,在对象创建的同一时间被调用。

-

16.创建默认构造器的目的是什么?

默认构造器给给对象提供一个默认的值,当这个对象的类中没有构造器的时候。

17.构造器return值吗?是的,那是当前实例,你不能return type但是可以return value。

18.构造器(constructer)可以继承吗?不能被继承。

19.构造器可以用final修饰吗?不可以。

static关键字

20.什么是静态变量(static variable)?

静态变量用于引用对象的公共属性(对于每个对象来说不是唯一的),比如员工的公司名字,学生的学校名字。

静态变量在class加载的时候获得内存,在Class Area区域。

21.什么是静态方法(static method)?

静态方法属于类而不属于类的对象。

不需要创建类的实例就可以调用静态方法。

静态方法可以访问静态数据成员并且修改它。

22.为什么main method是静态的(static)?

因为调用静态方法的时候不需要对象,如果main是非 静态的,那么首先JVM需要创建一个对象,然后才能调用main,这会造成额外的内存分配的问题。

23.什么是静态块(static block)?

用来初始化静态数据成员。

4000
它在类加载的时候被删除,在main之前。

24.不使用main的话可以执行程序吗?可以,使用静态代码块(static block)。

25.如果把static从main方法中移出去,会出现什么问题?

编译成功。但是运行时会抛出NoSuchMethodError。

26.static method和instance method方法的不同之处?

有static的叫做静态方法,没有static的方法叫做实例方法(instance method)。

call static method的时候不需要对象,但是call instance method的时候需要对象。

instance(Non-static)成员无法直接访问静态的context(比如static method, static block and static nested class),但是static method和instance method都可以访问instance method。

继承

27.什么是this?就是一个引用(refer)当前对象的关键字。

28.什么是继承?

继承是一种机制,一个对象获取另外一个对象的所有属性和行为的机制。

展现了IS-A 关系,可用于代码重用和方法覆盖。

29.所有class的superclass是什么?Object class。

30.为什么Java中不支持多重继承?

为了降低代码的复杂度,简化语言,Java在类上是不支持多重继承的,但是在接口上是支持的。

31.什么是组合(composition)?

就是在一些类中保存另外一些类的引用,叫做组合。

32.聚合(aggregation)和组合(composition)的区别?

aggregation(聚合)是强关系,组合是弱关系。

For example: bike has an indicator (aggregation) but bike has an engine (compostion).//无法理解。。。。

33.为什么Java不支持指针(pointers)?

指针是指向内存地址的变量。Java不用指针:它直接操作内存不安全,理解起来很复杂。

34.Java中的super?

它是它是一个引用直接父类对象的关键字。

35.构造器中可以同时使用super()和this()吗?

不行,它们两个都是必须在方法中的第一行语句使用,同时使用冲突。

36.什么是对象克隆?

对象克隆用于创建对象的精确副本。

method overloading

37.什么是方法重载(method overloading)?

如果一个class中有许多method的名字相同但是注入参数不同,那么就叫做方法重载(method overloading),它提高了程序的可读性。

38.通过改变方法的return类型来实现方法重载为什么不行?

因为模糊//纳尼。。。。

39.main方法可以重载吗?

当然可以。通过方法重载,一个类中可以有很多main方法。//记得加代码实例.

Method Overriding

40.什么是方法重写(method overriding)?

如果一个子类(subclass)提供了一个方法的具体实现,这个方法已经被它的superclass提供过了,这个叫做方法重写(method overriding)。

它被用在运行时多态方法的具体实现

41.可以重写静态方法(static method)吗?

不可以。因为静态方法是类的一部分,二不是对象的一部分。//和JVM有关,参考42。

42.为什么不能重写静态方法(static method)?

静态方法是class的一部分并且它和class绑定,但是实例化方法(instance method,非静态)和对象绑定。

静态方法的内存区域在Class Area,而instance method的内存区域在heap。

43.我们可以重写重载的方法吗?当然可以。

44.方法重写和方法重载的区别?

方法重载提高了程序的可读性,方法重写在子类中提供了父类已经提供的类的具体实现。

方法重载在类中发生,方法重写在两个具有IS-A关系的类中发生。

方法重载的参数是不能相同的,但是方法重写的参数必须相同。

45.Java中可以有虚拟函数吗?

当然可以,Java中的函数默认都是虚拟的。

46.什么是协变(covariant)返回类型?

Java5之后,重写一个方法可以通过改变它的返回值(如果它的返回值是子类的类型)来实现,这个就叫做协变返回类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java jdk jvm 面试 虚拟机