21、写clone()方法时,通常都有一行代码(不是必须有),是什么?
答案:super.clone()
super.clone()是浅度克隆,只是把原对象的对象属性的引用复制一份,基本数据类型的属性是完全复制的。
要想深度clone,就需要把对象中的引用类型的属性递归复制。
22、面向对象的特征有哪些方面
1. 封装,隐藏内部实现,只暴露公共行为
2. 继承,提高代码的重用性
3. 多态,体现现实生活中相似对象的差异性
4. 抽象,抽取现实世界中相似对象的共同点
23、java中实现多态的机制是什么?
Java中通过继承父类或实现接口,实现多态的机机制。
继承指子类继承父类的所有属性、方法、内部类。对于属性而言,如果子类的属性名和父类的属性名相同,则子类会把父类的属性隐藏。属性根据引用来调用,方法根据对象来调用;Java中只有单继承,一个子类只能直接继承一个父类。
实现指某类可以实现接口中的部分或所有方法,并能继承接口中的所有的属性和内部类。接口中的属性都为public static final类型,方法都为public类型,内部类都为public static类型。接口可以继承多个接口,实现类可以实现多个接口。
24、abstract class和interface有什么区别?
使用abstract修饰符的class为抽象类,abstract类不能创建的实例对象。
接口(interface)是一种特殊的类,使用interface关键字进行修饰。
下面比较一下两者的语法区别:
1. 抽象类可以有构造方法,接口中不能有构造方法;
2. 抽象类中可以有普通成员属性,接口中没有普通成员属性;
3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法;
4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型;
5. 抽象类中可以包含静态方法,接口中不能包含静态方法;
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型;
7. 一个类可以实现多个接口,但只能继承一个抽象类;
8. 在应用上也有区别,接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约;而抽象类在代码实现方面发挥作用,可以实现代码的重用。
补充:
答此问题,最好由概念出发,逐步加深,还可以提及一些抽象类和接口,让面试官了解你确实很清楚两者的区别。
25、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized,是否可同时是final?
1. abstract的method不可以同时是static的,因为abstract方法是抽象的方法,不能有方法体,是要被子类实现的,而static方法必须有方法体,两者不能在方法上共用。
2. abstract的method不可以同时是native的,native方法表示该方法要用另外一种依赖平台的编程语言实现的,其实是有实现的,只是不是Java代码实现的,所以,它也不能是抽象的,不能与abstract混用。另外native方法可以被子类重写,例如hashCode方法。
3. abstract的method不可以同时是synchronized的,abstract方法只能存在于抽象类或接口中,它不能直接产生对象,而默认synchronized方法对当前对象加锁,而abstract方法只能被子类继承,synchronized不能被继承,抽象方法使用synchronized,没有意思,因此Java不允许抽象方法使用synchronized修饰;synchronized 可以修饰构造器,但一个对象的构造器不可能同时被多个线程调用,这个也是多余的,但是Java不报错,应该是一个BUG。
4. abstract的method不可以同时是final的,因为抽象方法目的是让子类实现,而final方法是不让子类重写,再者从根本上是冲突的,不可以共用。