1.接口和抽象类的区别?
相同点:
- 接口和抽象类都不能实例化对象。
- 接口和抽象类都可以定于一抽象方法,并且一定要在他们的子类重写。
不同点:
- 定义的关键字不同,定义抽象类要使用abstract,定义接口要使用interface
- 抽象类中既可以有抽象方法也可以普通方法,而接口中只能包含抽象方法。
- 抽象类中的方法可以用任意权限进行修饰,但是接口中的方法只能用public修饰。
- 抽象类只能单继承,而接口可以多实现。
2.重载(overload)和重写(overwrite)区别?
重写的规则:发生在子父类之间,子类重写了父类中的方法
- 方法名、参数参数列表必须和父类保持一致
- 返回值类型要么和父类相同,要么子类的返回值类型是父类的返回值类型的子类。
- 访问修饰符要么和父类相同,要么子类的访问修饰符比父类的访问修饰符大。
- 方法中抛出的异常要么和父类相同,要么子类抛出的异常比比父类抛出的异常更小。
重载的规则(两同一不同)
- 同一个类中。
- 方法名相同。
- 参数列表不同(个数,顺序,类型)。
- 和返回值类型无关。
3.StringBuffer、StringBuilder、String区别?
- String字符串常量不可变,使用字符串拼接时会开辟新空间。
- StringBuffer是字符串变量、可变并且线程安全,在拼接字符串的时候直接原字符串的基础上进行追加。
- StringBuffer是字符串变量、可变但是线程不安全,在字符串的时候直接在原字符串的基础上进行追加。
- StringBuilder执行效率要高于StringBuffer,高于String。
- String是一个常量,不可变的,所以对于每次字符串的拼接都会创建一个新的对象,而StringBuilder和StringBuffer是变量,都是可变的,对于每次的字符串拼接都是采用append方法在原来的基础上进行追加,所以性能比String要高。
- StringBuffer是线程安全的,StringBuilder是线程不安全的,因此StringBuilder执行效率要高于StringBuffer。
- 对于大量数据的字符串拼接时,如果不考虑线程安全问题时优先采用StringBuilder,如果要保证线程安全时采用StringBuffer。