Java基础知识(二)

类、超类、子类

  1. Java中所有的继承都是公有继承
  2. 若希望调用超类(父类)中的方法,而不是当前类中的某个方法,可以使用特定的关键字super调用。但super与this不同,super不是一个对象的引用,它只是一个指示编译器调用超类方法的特殊关键字。
  3. 由于子类不能对父类的私有域初始化,所以可以通过super实现对超类构造器(含有参数的)的调用,使用super调用构造器的语句必须是子类构造器的第一句。若没有调用,则会默认调用无参数的构造器。
  4. 一个对象变量可以指示多种实际类型的现象被称为多态。 在运行时能够自动地选择调用哪个方法的现象叫动态绑定
  5. 对象方法的调用过程中:
    • 假如调用的方法是private、final、static方法,则编译器准确知道调用哪个方法,这种即静态绑定
    • 虚拟机预先会为每个类创建一个方法表,其中列出所有方法的签名和实际调用方法, 则在调用过程中查表即可。
  6. 在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。即假如超类中的方法是public,子类中覆盖该方法的时候也要定义为public。
  7. 定义为final的类或方法无法被继承或者覆盖。一个类被定义为final,只有其中的方法自动成为final,不包括域。
  8. 强制类型转换:
    • 只能在继承层次内进行类型转换
    • 在将超类转换成子类之前,应该使用instanceof进行检查(当x=null时,x istanceof C 返回值是false,而非报错)
  9. 包含一个或多个抽象方法的类本身必须被声明为抽象类;抽象方法充当着占位的角色,它们的具体实现在子类中;抽象类不能被实例化。
  10. Java中用于控制可见性的4个访问修饰符
  • 仅对本类可见:private
  • 对所有类可见:public
    • 对本包和所有子类可见:protected
    • 对本包可见:默认,无需修饰符

Object:所有类的超类

  1. hashCode方法:

    • 字符串的散列码是由内容导出的,所以只要字符串内容一致,他们的hashcode也相同
    • 若类中未定义hashCode方法,则由Object类默认的hashCode方法导出对象的存储地址
  2. equals方法:

    在Object类中,这个方法将判断两个对象是否具有相同的引用。

泛型数组列表

  1. ArrayList是一个采用类型参数泛型类,使用起来有点像数组,具有自动调节数组容量的功能。
  2. ensureCapacity(n) 该方法将分配一个包含n个对象的内部数组,然后调用n次add,而不用重新分配空间。
  3. trimToSize() 一旦能够确认数组列表的大小不再发生变化时,调用该方法会将存储区域的大小调整为当前元素数量所需的存储空间数目。垃圾回收站将回收多余的存储空间。应该在确认不会再添加任何元素时,调用trimToSize()
  4. 数组列表自动扩展容量的便利增加了访问元素语法的复杂程度。set(i,x)方法只能替换数组中已经存在的元素内容,要添加新的元素需要使用add方法
  5. 若要灵活地扩展数组,又要方便地访问数组元素,可采用以下方式:
    • 先利用ArrayList创建数组list,并添加所有的元素
    • 执行完以上操作,new一个同样大小的数组a,利用list.toArray(a)转换为正常数组
  6. remove(n) 可以从数组中删除位于位置n的元素,而位于该位置后的所有元素将向前移动一个位置,并且数组的大小减1。

对象包装器与自动装箱

  1. 所有的基本类型都有一个与之对应的类,如int对应的Integer等等,这些类被称作包装器(wrapper)
  2. 对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。
  3. 由于每个值分别包装在对象中,所以ArrayList\的效率远远低于int[ ]数组。
  4. 自动装箱即在应用过程中,对基本类型自动变换为包装器的处理,自动拆箱同理。
  5. == 运算符也可应用于对象包装器对象,只不过检测的是对象是否只想同一个存储区域。

参数变量可变的方法

常用的printf即参数变量可变的方法,同时用户也可以自己定义可变参数的方法。

(计算若干个数值的最大值):

1
2
3
4
5
public static double max(double… values){
double largest=Double.MIN_VALUE;
for(double v: values) if(v>largest) largest=v;
return largest;
}