1.面向对象有哪些特性?
答:继承,封装,多态,抽象
- 继承提高了代码的复用。但并不是很好
- 继承破坏的封装特性,父类改动,则子类可能出现问题,子类与父类需要同步
- 可以用继承的两种情形:同包继承,有明确的说明文档
- 跨包继承需要禁止
- 复合-转发由于继承属于装饰器模式(decorate)。转发类也就是包装类
- 封装属于门面模式(facade)
- 多态体现在,编译期多态:重载,运行期多态:继承,重写,向上造型
2.什么是clone:
答:当需要使用一个对象的当前属性值,但又不想影响该对象时,可以创建clone对象
- 实现方法:定义的类需要实现cloneable接口重写clone()方法
- 分为浅clone和深clone,浅clone是当类中属性为引用类型,而引用类型又没有实现clongable接口,仅仅是复制了引用的地址,因此clone出来的对象的引用属性改变时,会影响原来的对象,深clone是引用类型也实现了cloneable接口
- 用流的方式也可以进行对象的clone,而且是深clone,需要实现序列化接口。
3.equals
equals进行字符串的比较,==是进行基本类型的比较,equals的内部也是用==进行实现,比较的是地址对应的实际内容。==比较的是引用的地址。
4.重写与重载
答:都是多态的体现,一个是编译期多态,一个是运行期多态
- 重载:方法名称相同,参数不同,返回值和修饰符不做要求
- 重写:方法名称相同,参数相同,返回值相同,修饰符>=父类,异常<=父类
- 构造器不能重写
- 静态方法不能重写,但是可以重新声明
5.接口和抽象类
- 接口没有构造器
- 接口没有static方法
- 接口的成员变量都是常量,public static final
- 接口的方法默认都是public abstract
- 抽象方法不能static和synchronized修饰
- 接口没有实列方法,抽象类可有实例方法
6.switch(expr)语句中,expr可以有哪些值?
答:
- java4及以前:byte short int char
- java5:新增enum
- java7:新增string
7.字符串连接符+,stringbuilder,stringbuffer的区别?
答:
- stringbuffer线程安全,效率低
- stringbuilder效率高,不安全
- +在编译器转换成stringbuilder
- 字面量连接,+效率高,在编译期直接替换,stringbuilder在运行期计算
- 带引用类型的字符串拼接:stringbuilder快,+转换成stringbuilder。但是效率相差不大
- 循环拼接字符串,不要用+,每次都新建对象,占用内存。用stringbuilder.append()。
8.java中时间api
答:Date,Calender(可变的).java8之后推出的LocalDate,LocalTime,LocalDateTime,Instant,Clock这些都是线程安全的。并修复了一些以往的缺陷
9.java基本类型
- byte:无单位 -128~127
- short:无单位 -32768~32767
- int:无单位 12亿多
- long:单位l/L 2的63次方,默认0L
- float:单位f/F 默认0.0F
- double:单位d/D ,默认0.0D
- char:单引号或者数字,存储的字符是unicode,因此可以存放汉字,默认是空格
- boolean:默认false
- byte,short,int可以没有单位,不超过范围即可
- long,float,double可以没有单位,相当于int向上转型,建议带上单位
- 精度低的可以赋值给精度高的,默认转换,精度高的不能直接赋值精度低的,必须强转,强转,会丢失精度,和内存溢出
- 基本类型混合运算,自动向上转型
- s+=1,包含隐式类型转换
- 涉及金额运算用bigdecimal。
- 基本类型的范围,可以通过包装类得到。
10.POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误
11.接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的 Javadoc 注释