第五章 继承

类,超类和子类

  • super和this看似有类似的概念, 但实际没有可比性,this持有对象自己的引用, 能够赋值给另外一个变量,super则不具有这样的功能, 它只是一个指示编译器调用超类方法的关键字
  • 调用super()构造器的语句必须是子类构造器的第一条语句

Object: 全部类的超类

  • 判断两个对象是否相等可使用Objects.equals()静态方法, a.equals(b)的方式若是a=null时会报异常
  • equals()方法的最佳实践:
    1. 参数命名为otherObject
    2. 检测this和otherObject是否引用同一对象, if(this==otherObject) return true;
    3. 检测otherObject是否为null,为null则返回false,if(otherObject==null) return false;
    4. 比较this和otherObject是否为同一个类,若是equals()的语义在每一个子类中有改变, 就使用getClass()检测, if(this.getClass()!=otherObject.getClass()) return false; 若是全部子类都有统一的语义, 就使用instanceOf检测
    5. 将otherObject转化为相应的类类型变量,ClassName other = (ClassName)otherObject
    6. 对全部的域进行比较,==比较基本类型,equals比较对象,全部均匹配返回true, 若是子类从新定义了equals(),就要在其中包含调用super.equals(other).数组

  • 若是不想让子类从新实现equals()方法, 就将其定义为final, 并在其中实现对象的相等比较逻辑
  • Objects.hashCode()方法能够进行参数安全检查,若是参数时null该方法返回0,不然对参数调用hashCode()方法
  • 使用静态的Double.hashCode()来避免建立Double对象,其余包装类也能够这样使用
  • Objects.hashCode()提供了多参数方法,因此能够将多个值传入计算组合的hashcode.
  • Arrays.toString()能够打印数组,Arrays.deepToString()能够打印多维数组安全

泛型数组列表

  • 可使用@SuppressWarnings("unchecked")标注来标记变量可以接受类型转换

对象包装器和自动装箱

  • Java能够对包装类进行自动装箱和拆箱, 这就致使包装类的行为有点像基本类型,但对于==比较来讲不成立,应该使用equals()方法
  • 另外,装箱对象可能为null,null作运算会抛出异常(NullPointerException)
  • 装箱拆箱时编译器的行为,而不是虚拟机,生成class字节码时由编译器插入必要的方法.
  • 包装类时不可变的,也就是做为参数传递的包装类变量不会在方法内改变

参数数量可变的方法

  • 容许将数组传递给可变参数方法的最后一个参数

枚举类

  • 枚举类比较使用==便可

反射

  • 不建议使用反射,由于反射的大多实现都须要进行类型转换,使用直接调用或者lamda更好;另外反射比较脆弱,容易出问题,且出了问题很差查找
相关文章
相关标签/搜索