OOP – 琐碎


  1. 初始化:Java的对象不像是C++的引用,毕竟引用不空,而更像是指针。C++的语言规范(有些编译器就)不支持直接初始化数据成员,而是用一种初始化列表的形式。P.S. 现代C++提供了大括号初始化语法的统一。这也许是因为结构体(包括数组)在C++里可能是在栈上,因为总是先申请了对象空间,然后才对这块内存进行构造的,因而数据成员最好是在地化(为此,还专门重载了new操作符:new (ptr) Type)地构造,如果是赋值初始化的话,可能存在额外的数据拷贝。而Java所有的对象都在堆上,只涉及引用(指针)的赋值与否不再重要。另外,C++中如果存在初始化列表,那么对应数据成员的列表初始化或者类内(直接赋值)初始化就不再被调用了,而Java则会按顺序依次做一遍(默认初始化为0、false和null,然后按在代码中出现的顺序执行field初始化和初始化块,最后执行构造函数体。
  2. 桥方法:桥方法是Java在继承体系中实现协变返回类型与解决覆盖泛型方法对动态绑定的影响的机制,因为所有的对象至少都是Object类的,因而总能实现类型擦除与强制类型转换。返回值类型协变是编译器仅给自己开放的权限,实际上,JVM就是将返回值类型也作为重载因子的。
  3. 泛型类型擦除所产生的限制:
    31. 只能用var o = (Type<ParamType>[]) new Type<?>[10]的方式构造泛型类型的数组(不推荐),推荐使用泛型容器。因为擦除后的对象不具有类型信息,可以存放任意类型的元素。而泛型容器类型本身指定和记录着元素的类型。好比是,数组是一种不具备这种泛型类型记录能力的原始的容器。
    32. 无法构造泛型参数“类型”的对象或者数组,毕竟泛型类型还可能是抽象的。用于构造对象的具体类型只能通过参数传入,而现在,我们有lambda表达式与函数式接口协助。
    33. 同样也无法抛出泛型类型的对象,即便它扩展自Throwable也不行。原因也许在于捕获机制对精确到更具体的类型的追求。
  4. 接口:Java 8和9之后,已经可以为仅作为abstract方法集合的接口添加static和private的方法了,二者取代了之前的util和helper的额外定义。对于非static即instance方法,在需要新增public方法的时候,必要加default标记并提供方法定义以兼容旧的应用代码,否则,就类似于C/C++中未定义符号的情况了。
  5. Comparable<>(compareTo)与Comparator<>(compare):Comparable是sort方法排序默认被排序元素实现了的接口,而Comparator是需要额外提供的。Comparator类的方法分为三类:
    51. compare,一个instance方法(abstract),Comparator作为functional interface,仅此一个抽象方法。
    52. 一些static,类似于工厂方法,可用于生成Comparator对象。
    53. 一些instance方法(default):用于Comparator对象的拼接。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/280038.html

(0)
上一篇 2022年8月12日
下一篇 2022年8月12日

相关推荐

发表回复

登录后才能评论