暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

那些年我们面过的试--JAVA十问

首自信数据科学研究所 2021-09-09
314

JAVA

那些年我们面过的试--

JAVA十问


Java 是如何实现跨平台的?

01

注意:跨平台的是 Java 程序,而不是 JVM。JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM

答:我们编写的 Java 源码,编译后会生成一种 .class 文件,称为字节码文件。Java 虚拟机(JVM)就是负责将字节码文件翻译成特定平台下的机器码然后运行,也就是说,只要在不同平台上安装对应的 JVM,就可以运行字节码文件,运行我们编写的 Java 程序。


而这个过程,我们编写的 Java 程序没有做任何改变,仅仅是通过 JVM 这一 “中间层” ,就能在不同平台上运行,真正实现了 “一次编译,到处运行” 的目的。




什么是 JVM ?

02

解析:不仅仅是基本概念,还有 JVM 的作用。


答:JVM,即 Java Virtual Machine,Java 虚拟机。它通过模拟一个计算机来达到一个计算机所具有的计算功能。JVM 能够跨计算机体系结构来执行 Java 字节码,主要是由于 JVM 屏蔽了与各个计算机平台相关的软件或者硬件之间的差异,使得与平台相关的耦合统一由 JVM 提供者来实现。



JVM 由哪些部分组成?

03

解析:这是对 JVM 体系结构的考察


答:JVM 的结构基本上由 4 部分组成:


类加载器,在 JVM 启动时或者类运行时将需要的 class 加载到 JVM 中


执行引擎,执行引擎的任务是负责执行 class 文件中包含的字节码指令,相当于实际机器上的 CPU


内存区,将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器或者 PC 指针的记录器等


本地方法调用,调用 C 或 C++ 实现的本地方法的代码返回结果




类加载器有了解吗?

04

解析:底层原理的考察,其中涉及到类加载器的概念,功能以及一些底层的实现。


答:顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。


类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。




Java 虚拟机是如何判定两个 Java 类是相同的?

05

答:Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。即便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。比如一个 Java 类 com.example.Sample,编译之后生成了字节代码文件 Sample.class。两个不同的类加载器 ClassLoaderA和 ClassLoaderB分别读取了这个 Sample.class文件,并定义出两个 java.lang.Class类的实例来表示这个类。这两个实例是不相同的。对于 Java 虚拟机来说,它们是不同的类。试图对这两个类的对象进行相互赋值,会抛出运行时异常 ClassCastException。



说说Java中异常的分类

06

答:异常分类:

Throwable -> Error,Exception

Error:严重问题,例如内存溢出

Exception ->运行时异常:RuntimeException,编译时异常

AWTError




你都知道哪些常用的Map集合?

07

答:HashMap、HashTable、TreeMap、LinkedHashMap




面向对象的特征有哪些方面? 

08

答: 

1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

2)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

4)多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序函数同名问题。



Java 类加载过程?

09

在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析

装载:查找和导入类或接口的二进制数据;

链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;

校验:检查导入类或接口的二进制数据的正确性;

准备:给类的静态变量分配并初始化存储空间;

解析:将符号引用转成直接引用;

初始化:激活类的静态变量,初始化Java代码和静态Java代码块



垃圾回收的优点和原理,并考虑 2 种回收机制?基本原理是什么?

10

Java 语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理 的问题迎刃而解,它使得Java 程序员在编写程序的时候不再需要考虑内存管理。由于 有个垃圾回收机制,Java 中的对象不再有"作用域"的概念,只有对象的引用才有"作用 域"。垃圾回收可以有效地防止内存泄露,有效地使用可以使用的内存。垃圾回收器通 常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或 者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个 对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量 垃圾回收。



文章转载自首自信数据科学研究所,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论