1.Java语言特点?
面向对象(封装、继承、多态)、JVM实现与平台和操作系统无关(一次编译,随处运行)、支持多线程、可靠安全(异常处理和自动内存管理机制和安全防护机制)、高效(JIT编译器优化)、支持网络编程、编译与解释并存…
2.JavaEE vs JavaSE
JavaEE(Java Platform,Standard Edition,是 Java 的基础版本)
JavaSE(Java Platform, Enterprise Edition, 是 Java 的高级版本)
Java SE 更适合开发桌面应用程序或简单的服务器应用程序,JavaEE更适合开发复杂的企业级应用程序或 Web 应用程序。
3.JVM vs JDK vs JRE:
JVM:运行 Java 字节码的虚拟机,JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
JDK:它是功能齐全的JavaSDK,是提供给开发者使用,能够创建和编译Java程序的开发套件。它包含了JRE,同时还包含了编译 java 源码的编译器 javac 以及一些其他工具。
JRE:Java 运行时环境。它是运行已编译Java程序所需的所有内容的集合,主要包括Java虚拟机(JVM)、Java 基础类库(Class Library)。
4.什么是字节码?有什么好处?
JVM 可以理解的代码就叫做字节码(即扩展名为.class
的文件)它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。在.class文件>机器码时,JVM会逐行解释执行,后面引进了JIT,提高了运行效率。
5.为什么说Java语言“编译与解释并存”?
编译型语言:会通过编译器将源代码一次性翻译成可被该平台执行的机器码,编译语言的执行速 度比较快,开发效率比较低。常见的编译性语言有 C、C++、Go、Rust 等等。
解释型语言:会通过解释器一句一句的将代码解释(interpret)为机器代码后再执行,解释型语言开发效率比较快,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。
因为 Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class
文件),这种字节码必须由 Java 解释器来解释执行。
6.Java和C++的区别?
虽然,Java 和 C++ 都是面向对象的语言,都支持封装、继承和多态,但是,它们还是有挺多不相同的地方:
- Java 不提供指针来直接访问内存,程序内存更加安全
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
- Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
- C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载(操作符重载增加了复杂性,这与 Java 最初的设计思想不符)。
7.基本类型和包装类型的区别?
八种基本类型都有对应的包装类分别为:Byte
、Short
、Integer
、Long
、Float
、Double
、Character
、Boolean
- 用途:基本类型一般定义一些常量和局部变量,包装类型可用于泛型,比如方法参数、对象属性等。
- 存储方式:基本类型存在Java
- 虚拟机栈(局部变量)中,成员变量会存在堆中,包装类型属于对象类型般存在堆中。
- 默认值:成员变量包装类型不赋值就是
null
,而基本类型有默认值且不是null
- 比较方式:基本数据类型
==
比较值,包装==
比较对象的内存地址,equals()
方法比较值
8.为什么浮点数运算的时候就会有精度丢失的风险?
计算机是用二进制来存储的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。
9.静态变量有什么作用?
静态变量也就是被 static
关键字修饰的变量。可以被类的所有实例共享,无论一个类创建了多少个对象,它们都共享同一份静态变量。也就是说,静态变量只会被分配一次内存,即使创建多个对象,这样可以节省内存。
10.重载和重写有什么区别?
重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理
重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法
重载:发生在同一个类中(或者父类和子类之间),方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。
重写:重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写。方法名、参数列表必须相同