1. JDK、JRE、JVM 分别是什么,有什么关系?
JDK 即为 Java 开发工具包,包含编写 Java 程序所必须的编译、运行等开发工具以及 JRE。开发 工具如:
- 用于编译 Java 程序的 javac 命令。
- 用于启动 JVM 运行 Java 程序的 Java 命令。
- 用于生成文档的 Javadoc 命令。
- 用于打包的 jar 命令等等。
- 简单说,就是 JDK 包含 JRE 包含 JVM。
JRE 即为 Java 运行环境,提供了运行 Java 应用程序所必须的软件环境,包含有 Java 虚拟机 (JVM)和丰富的系统类库。系统类库即为 Java 提前封装好的功能类,只需拿来直接使用即可,可以 大大的提高开发效率。
简单说,就是 JRE 包含 JVM。
JVM 即为 Java 虚拟机,提供了字节码文件(.class)的运行环境支持
2. 什么是面向对象,面向对象的特征?
面向对象是一种思想,世间万物都可以看做一个对象,这里只讨论面向对象编程(OOP),Java 是一个 支持并发、基于类和面向对象的计算机编程语言。面向对象软件开发具有以下优点: 代码开发模块化,更易维护和修改。 代码复用性强。 增强代码的可靠性和灵活性。 增加代码的可读性。
四点:封装、继承、多态、抽象。
- 封装,给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部 的数据。在 Java 当中,有 4 种修饰符: default、public、private 和 protected 。每一 种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。 下面列出了使用封装的一些好处: 通过隐藏对象的属性来保护对象内部的状态。 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。 禁止对象之间的不良交互提高模块化。
- 继承,给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情 况下给现存的类添加新特性。
- 多态,是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作,可以 应用到其他类型的值上面。
- 抽象,是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。 Java 支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实 现细节分离开
3. == 和 equals 的区别是什么?
== 是关系运算符,equals() 是方法,结果都返回布尔值
Object 的 == 和 equals() 比较的都是地址,作用相同
== 作用:
- 基本类型,比较值是否相等
- 引用类型,比较内存地址值是否相等 不能比较没有父子关系的两个对象
equals()方法的作用:
- JDK 中的类一般已经重写了 equals(),比较的是内容
- 自定义类如果没有重写 equals(),将调用父类(默认 Object 类)的 equals() 方法,Object 的 equals() 比较使用了 this == obj 可以按照需求逻辑,重写对象的 equals() 方法(重写 equals 方法,一般须重写 hashCode 方 法)
4. String属于基本数据类型吗,Java 中的几种基本数据类型是什么?各自占用多少字节?
Java 支持的数据类型包括基本数据类型和引用类型。
基本数据类型如下:
整数值型:byte、short、int、long(1、2、4、8字节)
字符型:char 浮点类型:float、double(4、8字节)
布尔型:boolean
整数型:默认 int 型,小数默认是 double 型。Float 和 Long 类型的必须加后缀。比如: float f = 100f 。
引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。 引用类型包括类、接口、数组等。
特别注意,String 是引用类型不是基本类型。
5. char 型变量中能不能存贮一个中文汉字?为什么?
在 Java 语言中,char 类型占 2 个字节,而且 Java 默认采用 Unicode 编码,一个 Unicode 码是 16 位,所以一个 Unicode 码占两个字节,Java 中无论汉字还是英文字母,都是用 Unicode 编码来表示的。所以,在 Java 中,char 类型变量可以存储一个中文汉字。
6. 是否可以在 static 环境中访问非 static 变量?
static 变量在 Java 中是属于类的,它在所有的实例中的值是一样的。当类被 Java 虚拟机载入的时 候,会对 static 变量进行初始化。
如果你的代码尝试不用实例来访问非 static 的变量,编译器会报错,因为这些变量还没有被创建出 来,还没有跟任何实例关联上。
7. final 在 java 中有什么作用,它能修饰抽象类吗,finally和finalize分别有什么作用
1)final
final ,是修饰符关键字。
如果一个类被声明为 final ,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为 final 的。
不能修饰抽象类,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类
将变量或方法声明为 final ,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明 时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重写。
另外,在早期的 Java 实现版本中,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看 不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行这些优化 了)。类中所有的private 方法都隐式地指定为 final 。
2)finally
在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句 就会执行,然后控制就会进入 finally 块(如果有的话)。
在以下 4 种特殊情况下,finally块不会被执行:
在 finally 语句块中发