Java面试宝典-java基础02
Java面试宝典-java基础02
- 11、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- 12、this 和super 关键字的作用
- 13、在 Java 中,为什么不允许从静态方法中访问非静态变量?
- 14、final 与 static 的区别?
- 15、int可以强制转换为byte吗?
- 16、char 型变量中能存储一个中文汉字吗?
- 17、byte类型127+1等于多少
- 18、为什么数组的起始索引是0而不是1?
- 19、什么是机器语言?
- 20、什么是汇编语言?
11、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
当使用final关键字修饰变量时,这意味着该变量的引用地址被固定,它不能再指向另一个对象或值。然而,这并不意味着该引用所指向的对象的内容也不能改变。事实上,如果这个变量指向的是一个可变对象(如数组、集合或任何其他用户定义的可变类实例),那么对象的内容是可以修改的。
12、this 和super 关键字的作用
this关键字的作用
- 对象内部指代自身的引用;
- 解决成员变量和局部变量的同名问题;
- 可以调用成员变量,不能调用局部变量;
- 可以调用成员方法。
super关键字的作用
5. 调用父类的成员变量或方法
6. 调用父类的构造函数
其他关键字:
13、在 Java 中,为什么不允许从静态方法中访问非静态变量?
- 静态变量属于类本身,在类加载的时候就会分配内存,可以通过类名直接访问;
- 非静态变量属于类的对象,只有在类的对象产生时,才会分配内存,通过类的实例去访问;
- 静态方法也属于类本身,但是此时没有类的实例,内存中没有非静态变量,所以无法调用。
14、final 与 static 的区别?
当一个变量被声明为final时,它的值在初始化后不能被改变。对于引用类型,它指的是引用不可变,即不能再指向其他对象,但对象本身的状态可能改变。当方法被声明为final时,该方法不能被子类重写。当一个类被声明为final时,该类不能被继承。
当一个变量或方法被声明为static时,它属于类而非类的实例。静态变量在内存中只有一份,无论创建多少个类的实例,所有实例共享同一个静态变量。静态方法可以直接通过类名调用,无需创建类的实例。静态代码块在类加载时执行,通常用于系统初始化。
final关键字主要用于声明常量、防止继承和阻止方法重写,而static关键字主要用于实现与类相关联的变量和方法,以及控制类的初始化过程。
15、int可以强制转换为byte吗?
可以进行强制转换,在Java中,int是32位,byte是8位,如果强制转换,int类型的高24位将会被丢弃。
16、char 型变量中能存储一个中文汉字吗?
在 Java 中,char 类型占 2 个字节,而且 Java 默认采用Unicode 编码,一个Unicode 码占16 位,所以一个 Unicode 码占两个字节,char 类型变量可以存储一个中文汉字。
17、byte类型127+1等于多少
byte的范围是-128~127。
字节长度为8位,最左边的是符号位,而127的二进制为01111111,所以执行+1操作时,01111111变为10000000。
大家知道,计算机中存储负数,存的是补码的兴衰。左边第一位为符号位。
那么负数的补码转换成十进制如下:
一个数如果为正,则它的原码、反码、补码相同;一个正数的补码,将其转化为十进制,可以直接转换。
已知一个负数的补码,将其转换为十进制数,步骤如下:
- 先对各位取反;
- 将其转换为十进制数;
- 加上负号,再减去1;
例如10000000,最高位是1,是负数,①对各位取反得01111111,转换为十进制就是127,加上负号得-127,再减去1得-128; 下面这段代码的输出结果是什么?
public static void main(String[] args) {Integer i1 = 101;Integer i2 = 101;Integer i3 = 201;Integer i4 = 201;System.out.println(i1==i2);System.out.println(i3==i4);
事实上输出结果是:true false
为什么会出现这样的结果?输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对象。此时只需一看源码便知究竟,下面这段 代码是Integer的valueOf方法的具体实现:
public static Interger valueOf(int i){if(i>=-128&&i<=IntergerCache.high){return IntergerCache.cache[i+128];}else{return new Interger(i);}
}
通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创
建一个新的Integer对象。
上面的代码中i1和i2的数值为100,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,而i3和i4则是分别指向不同的对象。
其它的引用类型,可以去查看valueOf的实现。
18、为什么数组的起始索引是0而不是1?
这个习惯来源于机器语言,那时要计算一个数组元素的地址需要将数组的起始地址加上该元素的索引。将起始索引设为1要么浪费数组的第一个元素的空间,要么会花费额外的时间来将索引减1。
19、什么是机器语言?
机器语言是一种指令集的体系,是最早出现的计算机语言。 机器语言从属于硬件设备。 不同的计算机设备有不同的机器语言.所以机器语言是一种面向机器的语言。 计算机指令系统中的指令是由“0”和“1”两种符号组成的代码,并且能被机器直接理解执行,它们被称为机器指令。
一个计算机的机器指令的集,就构成了该计算机的机器语言,即计算机可以直接接受、理解的语言。
机器语言能利用机器指令精准地描述算法、且编程质量高、所占存储空间小,执行速度快。但是这种程序直观性很差,容易出错,阅读检查和修改调试非常困难。
20、什么是汇编语言?
汇编语言是一种低级计算机编程语言,它使用一种非常接近于计算机硬件的指令系统。因此,汇编语言也被认为是一种次级的计算机语言。
汇编语言的特点包括:
- 汇编语言可以提供对计算机硬件的直接访问,因此它被用于编写操作系统和嵌入式系统等高性能的程序。
- 汇编语言具有非常高的执行效率,因为它不需要进行高级语言的编译,也不需要进行解释,可以直接在硬件上执行。
- 汇编语言的代码密度非常高,因为它的指令系统非常紧凑,可以有效地利用内存空间。
- 汇编语言的执行速度非常快,因为它的指令可以直接被计算机硬件理解并执行。
- 汇编语言需要程序员有更深入的计算机体系结构和硬件知识,因为它的指令系统比较复杂,编写难度也比较大。
总的来说,汇编语言是一种面向机器的低级语言,它直接访问计算机硬件,具有高执行效率和代码密度等优点。但因为它的指令系统复杂,编写难度较大,需要程序员有较高的技术水平。