Java程序员面试宝典(9-10)
第9章 面向对象
-
对象是类的一个实例,如何确认什么时候需要实例,什么时候不需要?
对象是同类事物的一种抽象表现形式。
实例是对象的具体化。
一个对象可以实例化很多实例。对象就是一个模型,实例就是照着这个模型生产出的最终产品。
不用实例化:查询某个类是否拥有某个属性(男人是否有喉结,无须具体到某个人即可查询
要实例化:查询具体属性值(某个男人的体重 -
不通过构造函数也能创建对象吗?
可以。
Java创建对象的几种方式如下:- 使用new语句(调用构造函数
- 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstances实例方法。(调用构造函数
- 调用对象的clone()方法。(在内存上对已有对象的影印
- 运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。(从文件中还原类的对象
-
Java容器类
Java容器类库有两种主要类型:Collection和Map。
Collection类型中,每个“槽”只有一个元素;
Map类型中,持有Key-Value关联像一个小型数据库。
List:有序,取出顺序和放入顺序可能不同。
Set:每个值只能保存一个对象,不能含有重复的元素。
Queue:先进先出的容器。
在各种List中:
- 默认选择ArrayList
- 插入删除操作频繁,使用LinkedList
- Vector总比ArrayList慢
在各种Set中:
- HashSet通常优于HashTree(插入,查找)
- 只有需要产生一个经过排序的序列时才用TreeSet
- HashTree用于维护其内元素的排序状态
在各种Map中:HashMap用于快速查找。
当元素个数固定时,最好使用Array,因为Array效率最高。
-
请说明HashMap和HashTable的区别。
都属于Map接口类;
HashMap:允许null值;方法不是Synchronized。
HashTable:不允许null值;方法是Synchronized。 -
关于构造函数
- 构造函数没有返回值!!!
- 构造函数可以被重载和覆盖
- 创建子类时,祖先类的构造函数会先被调用
- 可以选择调用哪个构造函数,不能都不调用;若不指定,则调用无参的构造函数。
-
什么是多态?
开门、开窗户、开电视。这里的“开”就是多态。
“一个接口,多个方法”
允许将子类类型的指针赋值给父类类型的指针。 -
重载和覆盖
重载(overload):同一个类中,同个方法名,不同参数。
覆盖(override):发生在子类与父类之间,同一个方法名,相同的参数列表和返回值。(被覆盖条件:基类函数必须有virtual关键字)
静态方法不能被覆盖。
第10章 继承与接口
-
继承与组合方式的代码复用
在继承结构中,父类内部细节对子类可见,“白盒式代码复用”。
组合:对象间各自的内部细节不可见,“黑盒式代码复用”。 -
Java中的super关键字和this关键字
使用前都不需要声明。
super关键字,直接指向超类的构造函数,用来引用超类中的变量和方法;
this关键字,使用在一个成员函数的内部,指向当前对象(指调用当前正在执行方法的那个对象。
super关键字:- 子类的构造函数如果要引用super,必须把super放在函数的首位。否则,之前所做的修改就都回到以前,也就是又成了父类的构造方法。
- 如果子类中的成员变量或方法与父类的成员变量或方法同名,则子类中的成员变量或方法就隐藏了父类的成员变量或方法,若想调用父类的成员变量或方法就要用:
super.[成员变量名或方法名]
-
Anonymous Inner Class(匿名内部类)是否可以extends(继承)其他类?是否可以implements(实现)interface(接口)?
匿名内部类是没有名字的内部类,不能继承其他类,但一个内部类可以作为一个接口,由另一个内部类实现。 -
抽象类与接口
抽象类:
- 抽象类只能作为其他类的基类,不能直接被实例化
- 抽象类允许包含抽象成员(非必须),可以有非抽象方法
- 抽象类不能同时又是final的
- 如果一个非抽象类要从抽象类中派生,则其必须通过覆盖来实现所有继承而来的抽象成员。
- 抽象类可以被抽象类继承,结果仍为抽象类。
- 抽象类允许被声明。
接口类:
- 接口中的成员变量和方法都必须是公开(public)类型的
- 接口中的方法都是抽象方法
- 接口没有构造方法,不能被实例化,没有实例变量,只有静态变量
- 接口中的变量是所有实现类共有的,即常量。(不能出现变量
- 接口的属性默认是public static final常量,且必须赋初值
区别:
-
a. 抽象类可以有构造方法,接口中不能有构造方法。
-
b. 抽象类中可以有普通成员变量,接口中没有普通成员变量。
-
c. 抽象类中可以包含非抽象普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的方法。
-
d. 抽象类中的抽象方法的访问权限可以是 public、protected 和(默认类型,虽然 eclipse 不报错,但也不能用,默认类型子类不能继承),接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
-
e. 抽象类中可以包含静态方法,在 JDK1.8 之前接口中不能不包含静态方法,JDK1.8 以后可以包含。
-
f. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问权限可以是任意的,但接口中定义的变量只能是 public static final 类型的,并且默认即为 public static final 类型。
-
g. 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。