基础部分:
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)?
- 用来初始化静态数据成员。
- 它在类加载的时候被删除,在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之后,重写一个方法可以通过改变它的返回值(如果它的返回值是子类的类型)来实现,这个就叫做协变返回类型。