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

基础部分:

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的内存分配区有几种类型?

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)?
  • 用来初始化静态数据成员。
  • 它在类加载的时候被删除,在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之后,重写一个方法可以通过改变它的返回值(如果它的返回值是子类的类型)来实现,这个就叫做协变返回类型。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值