-
+= 是右结合运算符
-
枚举类型:变量只能存储这个类型声明中给定的某个枚举值,或者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
- 调用父类的方法
- 调用父类构造器,只能是第一条构造器,如果参数不一致编译报错
- 私有域
父类不能直接使用子类private私有域。
- 方法覆盖
在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。如果超类方法时public修饰,而子类遗漏了该修饰符,那么编译器会把它解释为试图提供更严格的访问权限。
-
阻止继承
final关键字修饰类,只有其方法被自动的成为final,而不包括域。
-
内联
早期java中,有些程序员为了避免动态绑定的带来的系统开销而使用final关键字,而如果一个方法没有被覆盖并且很短,编译器就能够对他进行优化处理,这个过程称为内联。
-
强转
在超类转换成子类前,应该用instanceof进行检查。
-
如何有效的定义equals
- 判断this==otherObject
- 判断otherObject==null
- 判断getClass==otherObject.getClass()
- 判断私有域的值是否一致
-
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)
-