重温java从入门到精通(第2版)-2

重温java从入门到精通(第2版)-2

  1. Map是Java中的一个类, EnumMap是Map接口的子类,它被视为专门为枚举类型量身定做的Map实现。虽然使用其他Map实现(例如HashMap)也可以完成枚举类型实例到值的映射,但使用EnumMap会更为高效。这是因为EnumMap只接收同一枚举类型的实例作为键值,枚举类型实例的数量有限并且相对固定,因此EnumMap使用数组来存放与枚举类型对应的值,这使得EnumMap的存取效率比较高。由于EnumMap继承自Map,Map中的方法都可以在EnumMap使用,通过调用EnumMap中的方法可方便地完成对枚举对象的操作。
  2. EnumSet可视为专门用于处理枚举(enmu)类型的Set类集。EnumSet本身是Set接口的子类,但是在此类中并没有提供任何的构造方法定义,这表明其构造方法被私有化了。此外,需要注意的是,所有对此类方法的操作均属于静态操作。初始化:EnumSet eSet = EnumSet.allOf(Color.class);
  3. Java为枚举扩展了非常强大的功能,但是在使用过程中,常会错用枚举,下面2点是使用过程中的注意事项。⑴ 枚举类型不能用 public 和 protected 修饰符修饰构造方法。构造方法的权限只能是private或者friendly,friendly是当没有修饰符时的默认权限。因为枚举的这种特性,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。】⑵ 定义枚举类型时,如果是简单类型,那么最后一个枚举值后可以不加分号。但是如果枚举中包含有方法,那么最后一个枚举值后面代码必须要用分号“;”隔开。
  4. 继承的限制:
    限制1:Java之中不允许多重继承,但是却可以使用多层继承。
    限制2:从父类继承的私有成员,不能被子类直接使用。子类在继承父类的时候会将父类之中的全部成员(包括属性及方法)继承下来,但是对于所有的非私有(private)成员属于显式继承,而对于所有的私有成员采用隐式继承(即对子类不可见)。子类无法直接操作这些私有属性,必须通过设置Setter和Getter方法间接操作。
    限制3:子类在进行对象实例化时,从父类继承而来的数据成员需要先调用父类的构造方法来初始化,然后再用子类的构造方法来初始化本地的数据成员。
  5. 被关键词static修饰的静态方法是不能被覆盖的, Java就是利用这一个特性达到隐藏的效果。在某些场景下,我们不希望父类的方法被子类方法覆写,即子类实例化后会调用父类的方法而不是子类的方法.
  6. 方法重载(Overload)和覆写(Override)区别(本题为常见的Java面试题)。重载是指在相同类内定义名称相同但参数个数或类型或顺序不同的方法,而覆写是在子类当中定义名称、参数个数与类型均与父类相同的方法,用于覆写父类中的方法。具体的区别如下表所示。在重载的关系之中,返回值类型可以不同,语法上没有错误,但是从实际的应用而言,建议,返回值类型相同。
  7. ⑴ 使用final修饰的类不能有子类(俗称太监类)。如果父类的方法不希望被子类覆写,可在父类的方法前加上final关键字,这样该方法便不会有被覆写的机会。⑵ 使用final定义的方法不能被子类所覆写。在父类中,将方法设置final类型的操作,实际编程时用途并不广泛,但是在一些系统架构方面会出现比较多,这里读者知道有这类情况存在即可。⑶ 使用final定义的变量就成为了常量常量必须在其定义的时候就初始化(即给予赋值),这样用final修饰的变量就变成了一个常量,其值一旦确定后,便无法在后续的代码中再做修改。一般来说,为了将常量和变量区分开来,常量的命名规范要求全部字母采用大写字母方式表示。
  8. 抽象方法是只声明而未实现的方法,所有的抽象方法必须使用abstract关键字声明,包含抽象方法的类也必须使用abstract class声明。抽象类定义规则如下:⑴ 抽象类和抽象方法都必须用abstract关键字来修饰;⑵ 抽象类不能直接实例化,也就是不能直接用new关键字去产生对象;⑶ 抽象类定义时抽象方法只需声明,而不需实现;⑷ 含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆写所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。
  9. 使用接口必须遵守如下原则。接口必须有子类,子类依靠implements关键字可以同时实现多个接口;接口的子类(如果不是抽象类)则必须覆写接口之中的全部抽象方法;接口可以利用对象多态性,利用子类实现对象的实例化。接口与一般类一样,本身也具有数据成员与方法,但数据成员一定要赋初值,且此值不能再更改,方法也必须是“抽象方法”或default方法。也正因为方法除default方法外必须是抽象方法,而没有一般的方法,所以接口定义格式中,抽象方法声明的关键字abstract是可以省略的。同理,接口的数据成员身上,因数据成员必须赋初值,且此值不能再被更改,所以声明数据成员的关键字final也可省略。
  10. 此时的程序,客户端没有和具体的子类耦合在一起,这样一来,如果再有更多的Fruit接口子类出现,只需要修改Factory类即可,即:所有的接口对象都通过Factory类取得。在程序员自己开发的代码之中,只要是遇见了取得接口对象实例的操作,都应该采用工厂设计模式。
  11. 总体来说,抽象类和接口在很大程度上都是可以互相替换使用的,但就是由于抽象类本身具备单继承局限,所以当抽象类和接口全部都可以使用的时候优先考虑接口,因为接口没有单继承局限,并且在Java8中接口可以设定默认方法,在一定程度上避免代码重复,利于后期的维护。
  12. Object的常用方法:
    构造方法Object(){}
    克隆 Object clone() 创建并返回该对象的一个副本
    boolean equals(Object) 其他对象是否与此对象"相等"
    void finalize() 当垃圾回收器确定不存在更多该对象的引用时候,由对象的垃圾回收器调用此方法
    Class getClass() 返回此Object的运行时类
    void notify() 唤醒在此对象监视器上等待的单个线程
    void notifyAll() 唤醒在此对象监视器上等待的所有线程
    void wait() 在其他对象调用此对象的notify()或者notifyAll()方法前保持等待
    String toString() 返回此对象的字符串表示
  13. 内部类主要有如下作用。⑴ 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。⑵ 内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以相互访问。但外部类不能访问内部类的实现细节,例如内部类的成员变量。⑶ 匿名内部类适合用于创建那些仅需要一次的类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值