• 《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)
        
  • 相关阅读:
    艾伟:一个让人遗忘的角落—Exception(二) 狼人:
    艾伟:ASP.NET 2.0的编译模型 狼人:
    艾伟:VS 2008快捷键 狼人:
    艾伟:[一步一步MVC]第一回:使用ActionSelector控制Action的选择 狼人:
    艾伟:C# Design Patterns (3) Decorator 狼人:
    艾伟:详解AJAX核心 —— XMLHttpRequest 对象 (下) 狼人:
    艾伟:HTML重构:战略篇 狼人:
    艾伟:WCF安全之EndPointIdentity 狼人:
    翻转句子中单词的顺序
    menucool
  • 原文地址:https://www.cnblogs.com/jimmyhe/p/13605303.html
Copyright © 2020-2023  润新知