本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. 构造器(Constructor)能否被重写(Override)?
构造器不能被重写,因为构造器的名称必须与类名相同,但是构造器能够被重载。
2. 方法重载和方法重写的区别
-
相同点
- 方法名相同
- 都是为了满足本类某种需求
-
不同点
- 位置不同: 重载发生在同一个类中,而重写发生在不同类并且是父类与子类之间
- 多态性不同: 重载实现的是编译时多态,而重写实现的是运行时多态
- 参数列表不同: 重载要求参数列表必须不同(个数、类型、顺序),而重写要求参数列表必须相同
- 返回值、访问权限、异常范围不同: 重载对返回值类型、访问修饰符权限、抛出异常范围没有要求,而重写要求子类方法返回值类型必须与父类相同或者是该子类的父类(直接父类或间接父类)、子类方法访问修饰符权限大于等于父类、子类方法抛出异常范围小于等于父类
3.面向对象的三大特性(是什么、有什么用、怎么用)
- 面向对象的三大特性为封装、继承、多态
- 封装就是将对象的字段和行为抽取并存放到一个独立的模块中,尽可能隐藏内部的信息和实现的细节,不需要让外界知道。良好的封装能够保证信息的安全性以及提高组件的复用性,降低耦合度。类中的字段使用private修饰,方法使用public修饰。
- 继承是指类或接口之间共享信息或行为的一种机制。通常被继承的类称为父类,继承父类的类称为子类。子类能够继承父类的所有成员,但不能操作私有成员,子类能在父类的基础上根据自身需求进行扩展。继承的关键字是extends,Java中类只有单继承,但可以多重继承,而接口可以多继承。
- 多态,简单地说就是同一对象具有多种形态。具体地说,就是同一引用类型变量,由于引用的实例不同,调用同一方法所产生的的结果不同。多态存在有三个前提,第一是存在继承或实现关系,第二是重写方法或实现接口中的方法,第三是父类引用指向子类对象(父引子)或接口引用指向实现类对象(接口new实现类)。多态是指方法的多态,属性是没有多态可言的。
4. String为什么是不可变的?
String类中使用字符数组来存储字符串,而字符数组使用final关键字修饰,因此,它是不可变的。
jdk 1.8及之前:
private final char value[];jdk 1.9及之后:
private final byte[] value;
5. String、StringBuffer、StringBuilder三者之间的区别?
-
可变性
-
String类中使用字符数组存储字符串,而字符数组使用final关键字修饰,所以String对象是不可变的。
-
而StringBuffer、StringBuilder都继承自AbstractStringBuffer类,在该抽象类中也是使用字符数组存储字符串,但没有使用final修饰,所以StringBuffer和StringBuilder对象是可变的。
jdk 1.8及之前:
char value[];jdk 1.9及之后:
byte[] value;
-
-
线程安全性
- String由于是不可变的,所以是线程安全的
- StringBuffer中的方法或调用的方法都使用了同步锁,所以也是线程安全的
- StringBuilder中没有使用同步锁,所以是非线程安全的
-
性能
- 由于String是不可变的,所以对String对象操作其实是创建了一个新的String对象,然后将指针指向新的对象,这样就很可能造成内存浪费。
- 而StringBuffer和StringBuilder虽然都是可变字符缓冲区,但同等情况下,由于StringBuilder是非线程安全的,相比StringBuffer性能高一些(大概提升10%~15%)
-
三者适用的场景:
- String:适用于较少操作字符串对象
- StringBuffer:适用于多线程下多次操作字符串
- StringBuilder:适用于单线程下多次操作字符串
6. 自动装箱和拆箱是什么?
- 自动装箱就是自动将基本数据类型转为相应的包装类对象,自动拆箱则与此相反
- 自动装箱和拆箱底层其实还是手动装箱和拆箱
Byte、Short、Integer、Long、Float、Double、Boolean、Character
7. 接口和抽象类的区别?
-
相同点
- 都能被继承
- 都是抽象概念的产物
- 都不能被直接实例化,即无法创建对象
-
不同点
- 成员不同:接口中只能定义常量(默认使用static、final修饰)和抽象方法(java8之后,可以有已实现的方法:静态方法和默认方法),抽象类中可以定义常量、变量、普通方法和抽象方法等
- 设计理念不同:接口是对行为的抽象,抽象类是对事物的抽象
- 访问修饰符不同:接口中只能使用public修饰,抽象类中除了抽象方法不能使用private修饰,其他方法可以使用任意修饰符
- 关系不同: 接口和接口、类和类之间是继承关系,前者可以多继承,后者只能单继承,接口和类之间是实现关系,可以单实现,也可以多实现
8. 构造方法有哪些特性?
- 方法名与类名相同
- 没有返回值,也不需要使用void关键字
- 创建类的对象时自动执行,无需人为调用
9. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
- 帮助子类做初始化工作(可能父类中会有业务上的初始化)
10. ==与equals的区别?
-
==
- 比较基本数据类型,比较的是值
- 比较引用数据类型,比较的是对象所指向的内存地址
-
equals()
- 只能用于引用数据类型的比较,能看到equals()中出现基本数据类型,是因为隐含了自动装箱
- equals()方法默认比较的是内存地址,但重写之后比较的是内容,比如String类就重写了equals()方法