格力2020秋招后端笔试题解析
-
Java编译器会将Java程序转换为
字节码
- jVM虚拟机的运行流程如下
- java编译器将java源文件编译为字节码文件(.class文件)
- 类加载器将字节码文件加载到JVM内存中
- 执行引擎把字节码转换为可执行机器码
- CPU结合本地库接口执行机器码
- jVM虚拟机的运行流程如下
-
给出如下代码,请修改后是程序正常运行:
将private int m 改为 static int m
class Test { private int m; public static void fun() { System.out.println(m); } }
-
JVM内存存储类型:
- stack segment(栈区):
- 基本数据类型的变量
- 自定义的对象的引用(不是具体对象,对象本身存储在堆区)
- 被执行的方法
- heap segment(堆区):
- 各种各样的对象,每个对象都包含一个与之对应的class信息。(class的目的是得到操作指令)
- code segment(代码区)
- 类中的方法,无论静态还是非静态
- data segment(数据区)
- static的变量或者字符串常量存储在数据区
- stack segment(栈区):
-
static和非static变量的区别和特点
-
存放位置不同
static存放在数据区,而非static根据其类型存储在堆区或者栈区。
-
访问权限不同
- static变量是全局的,类的所有对象、所有方法不管是static或者非static都能访问static。
- 非static变量是私有的,非static变量访问非static变量具体看访问修饰符,非static变量不能被static变量访问。
-
- 方法中声明的变量可以与非static变量并且是类的属性重名
- static方法中声明的变量可以与非static变量并且是类的属性重名
- (因为类的属性是存在堆区中的,而方法中的变量存在代码区中,在不同的区中可以重名)
-
-
-
下列叙述正确的是(
D
)a. 子类可以访问父类的所有成员
b. 除了继承父类的成员以外,子类不可以创建自己的成员
c. 当实例化子类时,父类的构造方法不被调用
d. 子类只能访问父类的非私有成员
-
修饰符的作用:
访问修饰符\作用范围 所在类 同一包内其他类 其他包内子类 其他包内非子类 private √ × × × default √ √ × × protected √ √ √ × public √ √ √ √ -
子类可以继承父类的所有成员,但是只能访问父类的非私有成员
-
子类不能重写子类的构造方法;当实例化子类时,父类的构造方法会在子类的构造方法里被调用
-
-
略
-
int x = 5, y = 7; void swap() { int z; z = x; x = y; y = z; } int main(void) { int x = 3, y = 8; swap(); printf("%d, %d\n", x, y); }
正确的输出结果为:
3,8
- swap函数并没有传参,所以调换的只是全局变量的x和y,而对main函数中的无影响,而在函数内默认先调用局部变量
-
下列关于B/S架构软件与C/S架构软件的区别描述错误的是
D
a. B/S输入C/S,浏览器只是特殊的客户端
b. C/S可以使用任何通信协议,而B/S这个特殊的C/S架构规定必须实现HTTP协议;
c. C/S架构的劣势还有高昂的维护成本且投资大
d. C/S架构维护和升级方式简单
- BS架构的CS架构的区别
- BS对计算机配置要求较低,而CS则要求较高
- BS不用安装任何专门软件,一个浏览器就可以访问各种服务器;而CS架构每个客户端都必须安装和配置专用软件
- CS架构每个客户端都需要进行升级维护,否则将无法使用;而BS只需要维护服务器即可
- CS架构对权限有多层校验,提供了更安全的存取模式
- 另外,BS必须实现HTTP协议这个,在早期的互联网中适用,现在已经有了多种协议可以适应BS架构,不是必须要实现HTTP协议,但是HTTP协议依旧是BS架构的主流
- BS架构的CS架构的区别
-
下面关于系统调用的描述中,错误的是
B
a. 系统调用把应用程序的请求传授给系统内核执行
b. 系统调用中被调用的过程运行在“用户态”中
c. 利用系统调用能够得到操作系统系统的多种服务
d. 是操作系统提供给编程人员的接口
-
什么是系统调用?
操作系统提供用户一种特殊的接口(API),用户通过这组特殊的接口来获操作系统内核服务提供的服务。
-
为什么用户程序不能直接访问系统内核提供的服务?
在系统中,为了更好地保护内核空间,将程序的运行空间分为内核空间和用户空间(也就是常称的内核态和用户态),它们分别运行在不同的级别上,在逻辑上是相互隔离的。
-
系统调用的逻辑过程?
当用户空间的进程需要获得一定的系统服务时,应用程序调用系统调用,这时操作系统就根据系统调用号(每个系统调用被赋予一个系统调用号)使用户进程进入内核空间的具体位置调用相应的内核代码。进行系统调用时,程序运行空间需要从用户空间进入内核空间,处理完后再返回到用户空间。
-
-
设已经有A,B,C,D四个类的定义,程序中A,B,C,D析构函数调用顺序为
ABDC
C c; void main() { A *pa = new A(); B b; static D d; delete pa; }
- 这个题是C++的题,但是也可以做
- 对于A为自行new的对象,手动释放,所以优先释放
- 对于B,是在栈中的引用,在main函数结束后就释放
- 对于C,作为一个类建立在静态存储区,对于c在程序结束时释放
- 对于D,也存储在静态存储区,在程序结束时释放,但是由于C是全局对象,初始化在main函数之前,所以析构函数在最后调用,D在其前
-
mysql中,结果集满足联结条件,该联结是
内连接
- mysql的联结:
- 内连接:包括等值连接(通过等号连接两侧)、非等值连接(通过非等号连接两侧)、自连接(连接的两个表为同一个),只有满足条件时才会被包含在结果集内
- 左连接:即使右表中没有匹配,也从左表返回行
- 右连接:即使左表中没有匹配,也从右表返回行
- 全连接:只要其中一个表中存在匹配,则返回行
- mysql的联结:
-
已知有序序列b c d e f g q r s t,则在二分查找关键字b的过程中,先后进行比较的关键字依次是多少?
fcb
-
二分当遇到偶数时,要么用 n / 2 + 1定位,要么用 n / 2 - 1 定位,但是不管用哪一种,程序从始至终都是那一种,
假如用n / 2 + 1,那么顺序将会是 g, d, c, b
假如使用n / 2 - 1,那么顺序将会是f, c, b
-
-
略
-
略
-
略
-
略
-
略
-
冒泡排序:
int* func(int* num, int n){ for(int i = 0; i < n; i++){ for(int j = 0; j < n - 1 - i; j++){ if(num[j] >= num[j + 1]){ int temp = num[j]; num[j] = num[j + 1]; num[j + 1] = temp; } } } return num; }
-
- 线程:线程是程序中的执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
- 多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
Q.E.D.