一、请问如何创建对象的方式都有哪些?
答:①用new语句创建对象;
②调用对象的clone()方法;
③运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
④运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。
二、请问构造方法满足哪些语法规则?负责什么?
答:①方法名必须与类名相同;
②无返回值;
③不能被static,final,synchronized,abstract和native修饰。
构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。
三、请问重载构造方法是干什么的?
答:可通过重载构造方法来表达对象的多种初始化行为。java语言允许在一个构造方法中,用this语句来调用另一个构造方法,this必须作为构造方法的第一条语句。
四、请问子类可以继承父类的构造方法吗?
答:不能。但可以通过super语句来调用父类的构造方法,super语句必须作为构造方法的第一条语句。
五、请问构造方法的作用域有哪些?
答:①当前类的其他构造方法通过this语句调用它。
②当前类的子类的构造方法通过super语句调用它。
③在程序中通过new语句调用它。
六、请问构造方法的访问级别有哪些?
答:public、protected、默认和private。
七、请问静态工厂方法有哪些命名?
答:①valueOf():该方法返回的实例与它参数具有同样的值。能执行类型转换操作。
②getInstance():返回的实例与参数匹配。
八、请问静态工厂方法最主要的特点是什么?
答:每次调用的时候,不一定要创建一个新的对象。
九、请谈谈单例类,并说说如何实现?
答:单例类是指仅有一个实例的类。在系统中具有唯一性的组件可作为单例类。这种类的实例通常会占用较多的内存,或者实例的初始化过程比较冗长。Struts框架的ActionServlet类,Hibernate的SessionFactory和Configuration类都是单例类。
实现方式:
①构造方法私有化,提供public static final类型的静态常量,该常量应用类的唯一的实例。
优点:实现起来比较简洁,而且根据类的成员的声明,能清楚地反映该类是单例类。
②构造方法私有化,提供public static类型的静态工厂方法。
优点:更灵活地决定如何创建类的实例,在不改变类的接口的前提下,可以修改静态工厂方法getInstance()的实现方式。
十、请你谈谈你对枚举类的认识?
答:枚举类是指实例数目有限的类。通常这样设计:
①构造方法私有化;
②提供一些public static final类型的静态变量,每个静态变量引用类的一个实例。
③如果需要的话,提供静态工厂方法,允许用户根据特定参数获得与之匹配的实例。
十一、请问用一个int类型的变量也能表示性别,比如表示女性,用1表示男性,这样不会使程序更简洁吗?为什么要用枚举类?
答:比如在Person类的构造方法中,gender参数为int类型,编程人员可以为gender参数传递任意整数值,如果传递的gender参数是无效的,那么java编译器不会检查这种错误,只有到运行时才会抛出IllegalArgumentException。
如果使用Gender枚举类,在Person类的构造方法中,gender参数为Gender类型,编程人员只能把Gender类型的实例传给gender参数,否则就通不过java编译器的类型检查。由此可见,枚举类能提高程序的健壮性,减少程序代码出错的机会。
十二、请你谈谈对不可变类的理解?
答:不可变类,是指当创建了这个类的实例后,就不允许修改它的属性值。所有的基本类型的包装类都是不可变类。
十三、如何创建自己的不可变类?
答:①把属性定义为private final类型。
②不对外公开修改属性的setXXX()方法;
③只对外公开用读取属性的getXXX()方法;
④在构造方法中初始化所有属性。