《Java核心技术》读书笔记(1-5章)

  • += 是右结合运算符

  • 枚举类型:变量只能存储这个类型声明中给定的某个枚举值,或者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)
      
posted @ 2020-09-03 00:34  Jimmyhe  阅读(249)  评论(0编辑  收藏  举报