Java基础加强知识
一、学习心得
这两周通过上班业余时间看完了张孝祥老师Java高新技术的基础加强视频,视频主要讲述的是eclipse的操作, JDK1.5的新特性(可变参数、枚举、注解和泛型等),反射,框架,内省,泛型和代理等内容。
感觉比较有难度的是枚举和泛型。这两个概念之前都很少接触过,枚举相对好理解,用处也比较多,后期在练习中多操作些估计就可以掌握的差不多了。但是泛型的概念头一次接触到,后面学习还得多加重视。
反射和内省知识点需要多练习,积累对这些知识点的印象和熟悉度,正应该像老师说的那样,可以不把重点放在一定要立即记下所有的方法名称等,那样太耗精力了,我们只要有个印象,某个类中有某个方法能帮我们实现某个功能就行了,其他方法名称我们记得不是很具体没有关系,类似eclipse的开发工具会帮我们记住的,需要用的时候按“Alt+/”查找提示就行了。
张老师的错误教学法,很是有效果,本来不确认的地方一经错误演示,立即就印象深刻起来,写程序就是要不怕错误,大胆尝试,出现问题后,查明是什么类型的错误或是什么原因造成的再改也不迟,那样还可以让我们学到更多的知识
二、主要知识点归纳
这段视频主要是以JDK1.5的新特性为主线的,于是搜罗了下资料再结合了下视频讲解及个人练习归纳如下:
比较JDK版本,JDK 1.5中新增的语言特性:
1.自动包装和解包
1.5版本支持了自动包装和解包操作,对于bool/Boolean,byte/Byte,double/Double,short/Short,int/Integer,long/Long,float/Float的相应包装/解包操作都进行了支持,从而使代码变得简单。比如,往一个ArrayList中加入一个整数,1.5版本以前需要这样编写:
List sheet = new ArrayList(); sheet.add( new Integer( 10 ) );
而现在在1.5版本中可以写为: sheet.add( 10 );
因为把一个整数包装成为一个Integer对象,然后加入到一个ArrayList中的做法被认为是没有必要的,反之,解包的做法也是没有必要的,系统会自动为我们干;
2.更优化的循环语句
一个典型的遍历数组的循环语句,1.5版本以前的写法是:
for (Iterator iterator=list.iterator();iterator.hasNext();) {Integer n = (Integer)iterator.next();}
而在1.5版本中可以写为:for ( Integer n : list ) {}
显然比以前是大大简化了,但是在需要修改集合,比如删除其中元素时不能采用这种写法。
3.参数可变的方法和printf
当不能确定一个方法的入口参数的个数时,以往版本的Java中,通常的做法是将多个参数放在一个数组或者对象集合中作为参数来传递,但在1.5版本中由原来的: int sum(Integer[] numbers)变为了int sum(Integer... numbers)
C风格的格式化输出方法——printf。
由原来的:System.out.println(x + " + " + y + " = " + nSum);
变为: System.out.printf("%d + %d = %d\n", x, y, nSum);
这种改变不仅仅是形式上的,printf还可以提供更为灵活、强大的输出功能,比如限定按照两位整数的形式输出,可以写为“System.out.printf("%02d + %02d = %02d\n", x, y, nSum);”,输出结果将是“05 + 07 = 12”。
4.枚举
以往的Java版本中没有enum关键词,1.5版本中终于加入了进来,
enum提供一个名为values()的静态方法,用以返回枚举的所有值的集合。
静态方法valueOf()则将以字符串的形式返回某一个具体枚举元素的值,比如“MyColor.valueOf(“Red”)”会返回“Color.Red”。
静态方法name()则返回某一个具体枚举元素的名字,比如“MyColor.Red.name()”会返回“Red”。类似的方法还有不少。此外,enum自身还可以有构造方法。
5.静态引用
当我们要获取一个随即数时,1.5版本以前的写法是:
import java.lang.Math; //程序开头处
double x = Math.random();
而在1.5版本中可以写为:
import static java.lang.Math.random; //程序开头处
double x = random();
静态引用使我们可以象调用本地方法一样调用一个引入的方法,当我们需要引入同一个类的多个方法时,只需写为“import static java.lang.Math.*”即可。这样的引用方式对于枚举也同样有效。
6.泛型
限定集合中的输入类型,让编译器挡住源程序中的非法输入。使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象;编译器也不需要对对象进行强制类型转换;
由于编译生成的字节码会去的泛型的类型信息,只要跳过编译器就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用add方法即可。
ArrayList<Integer>中的<>念typeof
7.注释(采用@前缀):
位置可以在包、类、字段、方法、方法的参数以及局部变量上
@Deprecated表示不鼓励程序员使用这样的元素,通常是因为它过时或存在更好的选择。运行阶段有用。
@Override表示一个方法声明打算重写超类中的另一个方法声明。源程序阶段有用。
@SuppressWarnings指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。源程序阶段有用。
定义一个最简单的注解:
public @interface MyAnnotation{}
信息的信息就是元信息;注解的注解就是元注解;
@Retention指示注释类型的注释要保留多久。其有三种取值:RetioonPolicy.SOURCE RetionPolicy.CLASS RetionPolicy.RUNTIME
@Target指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
为注解增加高级属性:
@MyAnnotation(arrayAttr={1、2、3});
@MyAnnotation(lamp = EnumTest.TrafficLamp.GREEN);
@MyAnnotation(annotationArr=@MetaAnnotation(“yyy”));