文章目录
11 String \StringBuffer\StringBuilder的区别是什么?String为什么是不可变的
String类中使用final关键字修饰字符数组来保存字符串,private final char[] value,所有String对象是不可变的
Java9之后,String类的实现改用byte数组存储字符串
private final byte[] value
StringBuffer和StringBuilder都继承自AbstrStringBuilder类,在AbstrStringBuilder类也是使用字符数组保存字符串char[] value,但是没有用final修饰,所以这两种对象都是可变的
String中的对象不可变,可以理解为常量、线程安全。StringBuffer使用了同步锁,是线程安全的。StringBuilder没有加锁,是非线程安全的,但性能比StringBuffer较高。
- 少量数据:适用String
- 单线程操作字符串缓冲区下操作大量数据:适用StringBuilder
- 多线程操作字符串缓冲区下操作大量数据:适用StringBuffer
12 自动装箱和拆箱
- 装箱:将基本类型用它们对应的引用类型包装起来
- 拆箱:将包装类型转换为基本数据类型
13 在一个静态方法内调用一个非静态成员为什么是非法的
静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态成员
14 在Java中定义一个不做事且没有参数的构造方法的作用
Java程序在执行子类的构造方法前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决方法是在父类里加上一个没有参数的构造方法
15 import java和javac有什么区别
刚开始的时候JavaAPI所必需的包是java开头的包、javax当时只是扩展API包来使用。然而随着时间的推移,javax逐渐扩展为JavaAPI的组成部分。但是,将扩展从javax包移动到java包确实太麻烦了,最终会破坏一堆现有的代码。因此,最终决定javax包将成为标准API的一部分。
所以,实际上java和javax没有区别。这都只是一个名字
16 接口和抽象类的区别是什么
- 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
- 接口中除了 static、final 变量,不能有其他变量,而抽象类中则不一定。
- 一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过 extends 关键字扩展多个接口。
- 接口方法默认修饰符是 public,抽象方法可以有 public、protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)。
- 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
jdk9在接口中引入了私有方法和私有静态方法
17 成员变量和局部变量的区别有哪些
定义的位置上区别:
-
成员变量是定义在方法之外,类之内的。
-
局部变量是定义在方法之内。
作用上的区别:
-
成员变量的作用是用于描述一类事物的公共 属性的。
-
局部变量的作用就是提供一个变量给方法内部使用而已。
生命周期区别:
-
随着对象 的创建而存在,随着对象的消失而消失。
-
局部变量在调用了对应的方法时执行到了创建该变量的语句时存在,局部变量一旦出了自己的作用域,那么马上从内存中消失。
成员变量是有默认的初始值;局部变量是没有默认的初始值的,必须要先初始化才能使用。
18 创建一个对象用什么运算符?对象实体与对象引用有何不同?
new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向0个或1个对象;一个对象可以被n个引用所指
19 什么是方法的返回值?返回值在类的方法里的作用是什么
获取某个方法体中的代码执行后产生的结果。作用是接收出结果,使得它可以用于其他操作
20 一个类的构造方法的作用是什么?若一个类没有声明构造方法,该程序能正确执行吗?为什么
主要作用是完成对类对象的初始化工作。可以执行,因为一个类即使没用声明构造方法也会有默认的不带参数的构造方法