掘友等级
获得徽章 14
速记:
在使用 finally 子句时不要写上如 return、thow、break、continue 这种能改变控制流程的语句,例如 finally 子句中的 return 语句会覆盖掉 try 子句中的 return 语句,甚至不在 catch 捕获范围中的异常也会被吞,不会正常向上抛出。
如果 finally 子句用作资源释放,且资源直接或间接实现了 AutoCloseable 接口,则建议使用 try-with-resources 替换 finally 去释放资源。
速记:
生成日志和调试消息时,通常要通过 getClass() 方法来获取当前的类信息,但因为此方法前隐藏了一个 this 关键字,所以在静态方法中无法使用。
此时可以通过 new Object() {}.getClass().getEnclosingClass() 来获取当前类信息,这里 new Object() {} 会建立 Object 的匿名子类的一个匿名对象,getEnclosingClass() 则能得到其外围类,即包含这个静态方法的类。
java这里是设计缺陷吗?
方法的重写要求方法返回值的范围要大于被重写的方法,但当返回值是引用数据类型时,被重写的方法返回值如果是父类,重写的方法返回值可以是子类,这就意味着子类的范围是要大于父类的,这也很好理解,因为子类可以拓展。
但是作为变量使用,子类引用指向父类时,又必须要使用强制转换,这又意味着子类的范围是小于父类的,这不是冲突了吗?
像基本类型的数据比如int和double作为返回值或者变量使用就没有这种冲突,是设计缺陷吗?
速记:一个类要想实现克隆操作,必须满足两个条件:
1. 实现 Cloneable 接口,将其标记为克隆合法的类
2. 重写 Object 类中的 clone() 方法,使用 super.clone() 调用克隆方法,并将其修饰符改为 public ,否则重写的 clone() 方法只能在类本身和其子类中调用
速记:
Arrays 的 copyOf() 方法和集合中 toArray() 方法都是基于反射包下 Array 类的 newInstance() 方法实现的,而 newInstance() 方法需要的参数则通过 java.lang 包下 Class 的 getComponentType() 方法获取的,getComponentType() 方法仅仅为获取数组的泛型而存在,却不放在 Array 类下,这不合理。
速记:
基本数据类型不属于对象,也不算做泛型,但基本数据类型的数组是一种特殊的对象/泛型,派生于 Object 。
例如 int[] a = {1, 2, 3} ,可以将 a 赋值给Object,但不可将 a 赋值给 Object[] 。
速记:Java中枚举类中的所有枚举项即是这个枚举类的实例,同一种枚举项即使创建多个对象,这些对象仍然引用自同一个实例。
速记:
new T[100] 会创建一个有100个元素初始值的数组,初始值如null、0、false;
new ArrayList<T>(100) 只是表示可能将保存 100 个元素,在前 100 次使用 add() 添加元素时不需要扩容,创建时并不会赋值任何初始值。
速记: 方法传递的是副本,如果传递的是基本数据类型,则副本的数值变化不会影响到原数据,如果传递的是引用数据类型,副本和原数据共享引用地址,被引用的对象属性的变化会同步给副本和原数据。
下一页