Java基础知识面试题(2020最新版)
Java概述:
编程是通过编写一系列指令来让计算机执行特定任务的过程。Java是一种广泛使用的高级编程语言,由Sun Microsystems(现为Oracle Corporation的一部分)开发,由James Gosling设计。Java的设计目标是具有简单性、面向对象、健壮性、安全性、平台独立性和可移植性等特性。
Javajdk1.5之后的三大版本:
自Java 1.5起,主要的版本分为J2SE(Java Standard Edition)、J2EE(Java Enterprise Edition)和J2ME(Java Micro Edition)。后来,这些名称分别被更名为Java SE、Java EE和Java ME,分别用于桌面应用、企业级应用和嵌入式设备。
JVM、JRE和JDK的关系:
JVM(Java Virtual Machine)是Java运行环境的核心,负责解释和执行字节码。JRE(Java Runtime Environment)包含了JVM和Java库,是运行Java程序所需的基本环境。JDK(Java Development Kit)是开发和调试Java程序的工具集合,它包括JRE以及编译器、调试器和其他开发工具。
什么是跨平台性?原理是什么?
Java的跨平台性指的是编写的Java代码可以在任何支持Java的平台上运行,无需重新编译。这是通过“一次编写,到处运行”的理念实现的。原理在于Java源代码被编译成字节码,这种中间代码可以在任何安装了Java虚拟机的平台上解释执行。
Java语言的特点:
1. 面向对象:支持类、接口、继承、封装、多态等特性。
2. 自动内存管理:通过垃圾收集器自动回收不再使用的内存。
3. 平台无关性:基于JVM运行,具有跨平台能力。
4. 强类型:变量必须先声明类型再使用。
5. 静态类型:类型检查在编译时进行。
6. 垃圾回收:自动处理无用对象的内存释放。
7. 安全性:防止恶意代码对系统造成破坏。
字节码:
字节码是Java编译器将源代码编译后的结果,是平台无关的机器指令集,由JVM负责解释执行。使用字节码的最大好处是实现了跨平台运行。
主类:
Java程序的主类包含main方法,它是程序的入口点。应用程序的主类通常包含main方法,而小程序(Applet)的主类则没有main方法,它们有自己的生命周期方法如init、start、stop和destroy。
Java应用程序与小程序的差别:
1. 运行环境不同:应用程序在JRE中运行,小程序在Web浏览器中通过Java插件运行。
2. 启动方式不同:应用程序通过java命令启动,小程序由Web服务器加载。
3. 功能与复杂度:应用程序可以处理更复杂的任务,而小程序主要用于Web交互。
Java和C++的区别:
1. 内存管理:Java自动管理内存,C++需要程序员手动分配和释放。
2. 类型系统:Java是强类型和静态类型,C++支持静态和动态类型。
3. 多线程:Java内置多线程支持,C++需要借助库实现。
4. 跨平台:Java有很好的跨平台能力,C++需要针对不同平台进行编译。
5. 面向对象:Java是纯面向对象,C++支持面向过程和面向对象编程。
Oracle JDK和OpenJDK的对比:
两者都是Java Development Kit,但Oracle JDK由Oracle公司提供,包含商业组件和长期支持。OpenJDK是开源项目,由社区维护,可能缺少某些商业特性。
基础语法部分:
Java有八种基本数据类型:整型(byte, short, int, long),浮点型(float, double),字符型(char)和布尔型(boolean)。
switch不能作用在byte、long或String上,但在Java 7以后可以作用在枚举类型上。计算2乘以8的最有效率方法是使用位运算符`<<`。Math.round()函数返回最接近参数的整数,因此Math.round(11.5)等于12,Math.round(-11.5)等于-11。float f=3.4是正确的,而short s1=1; s1=s1+1; 会有类型不匹配的错误,但s1+=1是合法的,因为Java会自动转换类型。
在Java中,编码通常采用UTF-8,具有广泛的支持和兼容性。注释包括单行注释(//)、多行注释(/*...*/)和文档注释(/**...*/)。访问修饰符public、private、protected和默认(包访问)分别代表公共、私有、受保护和同一包内的访问级别。
运算符`&`是按位与,`&&`是逻辑与。`final`用来声明常量或不可变对象,`finally`用于异常处理,确保代码块总能被执行,`finalize`是对象被垃圾收集前调用的方法。`this`关键字表示当前对象,`super`用于访问父类成员。
static关键字用于声明静态变量和方法,它们属于类而非实例。在静态方法中不能直接访问非静态成员,因为它们在没有对象的情况下无法使用。面向对象的特性包括封装、继承、多态。多态是Java通过方法重写和接口实现的。
类与接口是面向对象的两种重要概念,抽象类不能实例化,用于定义共同行为,接口则规定实现者必须实现的方法。构造方法用于初始化新创建的对象,无参构造方法是默认的,用于简化对象创建。没有声明构造方法时,编译器会自动生成无参构造方法。
静态变量和实例变量的区别在于存储位置和生命周期,静态变量属于类,而实例变量属于对象。静态方法与实例方法的调用方式不同,静态方法通过类名调用,实例方法通过对象调用。流程控制语句如break、continue和return用于控制程序流程。面向对象设计原则包括单一职责、开闭原则、里氏替换、依赖倒置和接口隔离等。