• += 是右结合运算符
  • 枚举类型:变量只能存储这个类型声明中给定的某个枚举值,或者null,表示没有设置任何值。
  • switch,如果case匹配不上会调用default
  • for循环中注意浮点数的判断
for(double i=0,i!=10,i+0.1){
  sout{i}
}
  • Arrays是一个类,包含操作数组的静态方法如toString,sort,equal,binarySearch
  • 二维数组实际上是一个特殊的数组,第一个索引是数组的内存中的位置,第二个是该数组的元素索引。
  • 隐式参数,如this,方法的调用者,如this。显示参数,传递的参数。
  • 类的静态域是所有实例共享
  • 静态方法使用的场景
  • 不需要访问对象状态
  • 一个方法只需要访问类的静态域
  • 方法参数使用
  • 不能修改一个基本数据类型的参数
  • 可以改变一个对象的参数状态
  • 不能让对象参数引用一个新的对象,无法实现交换功能
  • 一个构造器可以调用另一个
// 使用this
public Employee(double s){
	this("employee",s);
	nextId++
}

第五章 继承

  • super
  1. 调用父类的方法
  2. 调用父类构造器,只能是第一条构造器,如果参数不一致编译报错
  • 私有域

父类不能直接使用子类private私有域。

  • 方法覆盖

在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。如果超类方法时public修饰,而子类遗漏了该修饰符,那么编译器会把它解释为试图提供更严格的访问权限。

  • 阻止继承
    final关键字修饰类,只有其方法被自动的成为final,而不包括域。
  • 内联
    早期java中,有些程序员为了避免动态绑定的带来的系统开销而使用final关键字,而如果一个方法没有被覆盖并且很短,编译器就能够对他进行优化处理,这个过程称为内联。
  • 强转
    在超类转换成子类前,应该用instanceof进行检查。
  • 如何有效的定义equals
  1. 判断this==otherObject
  2. 判断otherObject==null
  3. 判断getClass==otherObject.getClass()
  4. 判断私有域的值是否一致
  • ArrayList
    ensureCapacity设定了一个值可以加快arrayList初始化时间
    add方法添加,set用来替换,如果不存在会报错
public void demoTest01(){
        ArrayList<String> list = new ArrayList<>(3);
        list.set(0,"3");
    }
    
    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
  • 装箱拆箱
    包装类由于每个值分别包装在对象中,所有ArrayList<Integer>的效率远远低于int[]数组,适用于小型集合。
    自动拆箱 list.get(i), 自动装箱list.add(3)
    如果在一个条件表达式中,混合使用Integer和Double类型,Integer会自动拆箱提升为double,装箱为Double。
Interger n = 1
Double m = 2.0
sout(true: n ? m)

包装器类是不可改变的,一旦构造了包装类,就不允许修改包装类的值,同时包装类是final,不允许子类去继承重写他。

Integer类里有一些可以进制转化的方法

String s = Integer.toString(3, 2);
        System.out.println(s);
        // 11
  • 反射
    getMethods返回此类和超类的所有方法
    getDeclareMethods不返回超类信息
    java.lang.reflect.Field ,java.lang.reflect.Method,java.lang.reflect.Constroctor
  • getDeclaringClass() 返回该类的class对象
  • getExceptionTypes() 返回constructor或method中的异常
  • getModifiers() 返回修饰符的整形,利用Modifier类可以分析
  • getName()返回名称
  • getParameterTypes返回参数类型的class对象
  • getReturnType 返回method中的返回值类型class
  • 获取数组中元素类型
@Test
    public void demoTest02(){
        Employee mike = new Employee("mike");
        Employee jack = new Employee("jack");

        Employee[] employees = {mike,jack};
        System.out.println(employees.getClass()); //class [Lcom.hjj.demo.Employee;
        Class<?> componentType = employees.getClass().getComponentType();
        System.out.println(componentType); // class com.hjj.demo.Employee
        
    }

用Array类的静态方法,给数组(可看作object类型)赋值

Object o = Array.newInstance(componentType, 3);
     // 若set其他类型会报错 java.lang.IllegalArgumentException: array element type mismatch
     Array.set(o,0,new Employee("jason")); 
     // 若get一个未设置的索引会有NPE异常。
     System.out.println(Array.get(o,0).toString());
  • Method类中invoke方法,允许调用包装在当前Method对象中的方法
    对于静态方法,第一个参数可以被忽略,设置为null
// 假如ml是Employee的getName方法

String name = (String)ml.invoke(jack)
  • 获取方法指针
Method m1 = Employee.class.getMethod("getName")
Method m2 = Employee.class.getMethod("raiseSalary",double.class)