Java常见经典面试题(二)

Java常见经典面试题(二)

11.final、finally、finalize区别,怎么使⽤?
答: 区别:final 在java中他是一个关键字,可以用来修饰类,方法和变量(成员变量或局部变量),而finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等;
final的使用:
1.修饰类:当用final修饰类的时,表明该类不能被其他类所继承。final类中所有的成员方法都会隐式的定义为final方法
2.修饰方法:把方法锁定,以防止继承类对其进行更改。就是该方法不能被重写
3.修饰变量:final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。
finally的使用:用在try/catch语句中并且附带着一个finally语句块,表示这段语句最终总是被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下,但注意finally语句块并不一定会执行(遇到try/catch中有return就不执行)
finalize的使用:finalize()方法是在GC清理它所从属的对象时被调用的,如果执行它的过程中抛出了无法捕获的异常(uncaughtexception,GC将终止对改对象的清理,并且该异常会被忽略;直到下一次GC开始清理这个对象时,它的finalize()会被再次调用。

12.局部变量和成员变量的区别?
答:1.从语法形式上看:成员变量是属于类的,⽽局部变量是在⽅法中定义的变量或是⽅法的参数;成员变量可以被 public,private,static 等修饰符所修饰,⽽局部变量不能被访问控制修饰符及static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
2.成员变量如果没有被赋初值:则会⾃动以类型的默认值⽽赋值(⼀种情况例外:被 final 修饰的
成员变量也必须显式地赋值),⽽局部变量则不会⾃动赋值。
3.从变量在内存中的⽣存时间上看:成员变量是对象的⼀部分,它随着对象的创建⽽存在,⽽局部变量随着⽅法的调⽤⽽⾃动消失。
4.从变量在内存中的存储⽅式来看:如果成员变量是使⽤ static 修饰的,那么这个成员变量是属于类的,如果没有使⽤ static 修饰,这个成员变量是属于实例的。对象存于堆内存,如果局部变量类型基本数据类型,那么存储在栈内存,如果为引⽤数据类型,那存放的是指向堆内存对象的引⽤或者是指向常量池中的地址。

13.字符型常量和字符串常量的区别?
答:分为三个方面
1.形式上: 字符常量是单引号引起的⼀个字符; 字符串常量是双引号引起的若⼲个字符
2.含义上: 字符常量相当于⼀个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表⼀个地址值(该字符串在内存中存放位置)
3.占内存⼤⼩:字符常量只占 2 个字节; 字符串常量占若⼲个字节 (注意: char 在 Java 中占两个字节)

14.构造器是否可被 重写?
答:Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到⼀个类中有多个构造函数的情况。

15.重载和重写的区别?
答:重载就是同样的⼀个⽅法能够根据输⼊数据的不同,做出不同的处理,参数不同
重写就是当⼦类继承⾃⽗类的相同⽅法,输⼊数据⼀样,但要做出有别于⽗类的响应时,你就要覆盖⽗类⽅法

16.聊一下⾃动装箱与拆箱?
答:装箱:将基本类型⽤它们对应的引⽤类型包装起来;拆箱:将包装类型转换为基本数据类型;

17.值传递和引⽤传递区别?
答:java 都是引用传递,对于 基本数据类型,传递是值的副本 , 而不是值本身 。 对于对象类型,传递是对象的引用 ,当在一个方法操作操作参数的时候,其实操作的是引用所指向的对象。

18.equals与==的区别?
答:== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
1、比较的是操作符两端的操作数是否是同一个对象。
2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
3 、 比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true ,如: int a=10 与 long b=10L 与 double c=10.0 都是相同的(为 true ),因为他们都指向地址为 10 的堆。
equals: equals用来比较的是两个对象的内容是否相等 ,由于所有的类都是继承自 java.lang.Object 类的,所以 适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然 Object 类中的方法,而 Object 中的 equals 方法返回的却是 == 的判断。
所有比较是否相等时,都是用 equals 并且在对常量相比较时,把常量写在前面,因为使用 object 的 equals object可能为 null 则空指

19.Hashcode和equals的区别?
答:equals方法用于比较对象的内容是否相等(覆盖以后),hashcode方法只有在集合中用到,hashCode是为了提高在散列结构存储中查找的效率,在线性表中没有作用。在java中,如果hashcode相同,对象可以相同,可以不同,但若hashcode不同,对象必然不同。

20.创建对象在JVM中的过程?
答:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用表的类是否已被加载,解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。

猜你喜欢

转载自blog.csdn.net/Z3068236782/article/details/115019587