一、java7以后,使用带泛型的接口,类定义变量,那么调用构造器创建对象时构造器的后面不必带上泛型。List<String> list = new ArrayList()<>;菱形语法
java9甚至允许创建匿名内部类时使用菱形语法 A<String> a = new A<>{ }
二、当创建了带泛型声明的接口或父类后,子类或者实现类继承实现父类接口时,父类与接口不可以在包含泛型形参。 如 A extends B<T> 写T 不允许,指明实际参数
如 A extends B<String> 或 A extends B 也可以。调用方法时形参必须添加具体形参。
三、类型通配符 List<?>,Set<?>,Map<?,?> 这种写法支持任何支持泛型声明的接口和类。 但是不能向其中添加对象(除了null)。因为无法确定集合中元素的类型。
设定类型通配符上限 List< 子类 extends 父类> 但是不能向其中添加对象。因为无法确定集合中元素的类型。Bar是Foo的子类,A<Bar> 相当于 A<? extend Foo>的子类,可已经A<Bar> 赋值给 A<? extends Foo>类型的变量,这种型变方式称为协变。
List<? extends Foo> list= new ArrayList<>(); List<Bar> barList= new ArrayList<>(); list= barList; //
设定类型通配符下限 List< ? super 子类> ,Foo是Bar的子类,A<Bar> A<Object> 赋值给 A<? super Foo>,这种型变称之为逆变。能往集合中添加Foo 或者Foo子类的对象。不能添加E的任何父类对象,读取时的对象为Object 类型。。
List<? super Foo> list= new ArrayList<>(); List<Bar> barList= new ArrayList<>(); list= barList; // 逆变
四、泛型方法 语法 修饰符 <T,S 多个逗号隔开> 返回值类型 方法名(形参列表){ //方法体}
五、java7 捕获多种类型的异常是,多种异常类型之间要用 | 隔开。 异常变量有隐式final修饰不能 对 变量二次赋值
try{ }catch( A | B | C 变量){ // ABC 代表不同的异常类
变量 = new Exception("exception"); 错误 变量是隐式final修饰。 }
六、异常对象的几个重要方法
getMessage() : 返回该异常的详细描述字符串
printStackTrace() : 该异常的跟踪栈信息输出到标准错误输出。
printStackTrace(PrintStream s) 将该异常的跟踪栈信息输出到指定输出流
getStackTrace() 返回该异常的跟踪栈信息。
七、垃圾回收不会回收任何物理资源,如数据库连接,网络连接,磁盘文件等。这些物理资源必须进行显式回收。
八、java9 会在try语句块中自动关闭资源。相当于包含了隐式的finanlly块(这个finally块用于关闭资源),因此这个try语句可以没有catch或者finally
创建对象 A ,B try( A,B){ } 或者 try(创建对象 A ;B ){ }
九、check异常 要么显式声明抛出,要么显式捕获并处理。 uncheck异常 runtimeException ,error.
十、使用throws 声明抛出异常。 在方法上使用 ,void method () throws exception 1,exception2(){}
十一、throw new Exception("exception");
十二、声明自定义异常都应该继承Exception基类,如果希望定义Runtime异常,要继承RuntimeException基类。定义自定义异常时通常要提供两个构造器
一个是无参构造器;另一个是带一个字符串参数的构造器(也就是异常对象的getMessag()方法的返回值)。
十三、避免把java的异常跟踪栈打印出来。要编写代码处理。