Java程序员面试宝典(9-10)

第9章 面向对象

  1. 对象是类的一个实例,如何确认什么时候需要实例,什么时候不需要?
    对象是同类事物的一种抽象表现形式。
    实例是对象的具体化。
    一个对象可以实例化很多实例。对象就是一个模型,实例就是照着这个模型生产出的最终产品。
    不用实例化:查询某个类是否拥有某个属性(男人是否有喉结,无须具体到某个人即可查询
    要实例化:查询具体属性值(某个男人的体重

  2. 不通过构造函数也能创建对象吗?
    可以。
    Java创建对象的几种方式如下:

    • 使用new语句(调用构造函数
    • 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstances实例方法。(调用构造函数
    • 调用对象的clone()方法。(在内存上对已有对象的影印
    • 运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。(从文件中还原类的对象
  3. 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效率最高。

  1. 请说明HashMap和HashTable的区别。
    都属于Map接口类;
    HashMap:允许null值;方法不是Synchronized。
    HashTable:不允许null值;方法是Synchronized。

  2. 关于构造函数

    • 构造函数没有返回值!!!
    • 构造函数可以被重载和覆盖
    • 创建子类时,祖先类的构造函数会先被调用
    • 可以选择调用哪个构造函数,不能都不调用;若不指定,则调用无参的构造函数。
  3. 什么是多态?
    开门、开窗户、开电视。这里的“开”就是多态。
    “一个接口,多个方法”
    允许将子类类型的指针赋值给父类类型的指针。

  4. 重载和覆盖
    重载(overload):同一个类中,同个方法名,不同参数。
    覆盖(override):发生在子类与父类之间,同一个方法名,相同的参数列表和返回值。(被覆盖条件:基类函数必须有virtual关键字)

静态方法不能被覆盖。

第10章 继承与接口

  1. 继承与组合方式的代码复用
    在继承结构中,父类内部细节对子类可见,“白盒式代码复用”。
    组合:对象间各自的内部细节不可见,“黑盒式代码复用”。

  2. Java中的super关键字和this关键字
    使用前都不需要声明。
    super关键字,直接指向超类的构造函数,用来引用超类中的变量和方法;
    this关键字,使用在一个成员函数的内部,指向当前对象(指调用当前正在执行方法的那个对象。
    super关键字:

    • 子类的构造函数如果要引用super,必须把super放在函数的首位。否则,之前所做的修改就都回到以前,也就是又成了父类的构造方法。
    • 如果子类中的成员变量或方法与父类的成员变量或方法同名,则子类中的成员变量或方法就隐藏了父类的成员变量或方法,若想调用父类的成员变量或方法就要用:
      super.[成员变量名或方法名]
  3. Anonymous Inner Class(匿名内部类)是否可以extends(继承)其他类?是否可以implements(实现)interface(接口)?
    匿名内部类是没有名字的内部类,不能继承其他类,但一个内部类可以作为一个接口,由另一个内部类实现。

  4. 抽象类与接口

抽象类:

  • 抽象类只能作为其他类的基类,不能直接被实例化
  • 抽象类允许包含抽象成员(非必须),可以有非抽象方法
  • 抽象类不能同时又是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. 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。