学习了一下可变参数的写法。技术更新很快啊,一不小心就看不懂代码了
第一章 Java5.0新特性1、j2se5.0:TigerJavaEE@xuxiang 94Java/JavaEE学习笔记Jonny xuxiang5612@sina.comj2se6.0:Mustang2、jdk5新特性:1)泛型(Generics):参数化类型 *****List<student> listlist.add(Student);list.add(Dog); //complie error(Student)list.get(2)ClassCastException2)自动装箱/拆箱 *****Integer i = new Integer(10);Integer j = 10; //jdk5.0自动装箱int a = i.intValue();int b = i; //jdk5.0自动拆箱3)对for循环功能的增强 *****for(定义循环变量;循环条件;改变循环变量){............}for(int i=0;i<=100;i++){........}for(定义集合中数据类型变量:集合){.......}for(Student s : list){........}4)增加了类型安全的枚举类型class,interface,enum5)可变参数sum(int... args){ //参数个数不确定,可用“...”代替for(int i=0;i<args.length;i++){total+=i;}rerurn total;}main(){sum(1,3,5);}6)静态导入import java.io.*;import java.net.*;import static java.lang.System.*; //导入包中静态的属性或者方法(如System.out.println();)import static java.lang.Math.*;JavaEE@xuxiang 95Java/JavaEE学习笔记Jonny xuxiang5612@sina.comout.println();random();7)元数据(Metadata):用来描述其它数据的数据Annotation(标注、注释) ---> EJB 3.0第二章 基础知识1、自动装箱、拆箱1)自动装箱:将基本数据类型转换成包装类型2)自动拆箱:将包装类型转换成基本数据类型注意:自动装箱、拆箱由编译器帮我们实现,我们不需要进行其它处理Integer ----> int i.intValue()String ----> int Integer.parseInt(String i)int ----> Integer Integer.valueOf(int i)IDE:Eclipse,IBM,Borland公司,JBuilder创建一个自动装箱、拆箱测试例子:tiger_jd0805 //new Projectsrc //Project layout中选第二个--com.briup.day1(package) //new package--BoxingTest //new class自动格式化:ctrl+shift+f自动导包:ctrl+shift+o自动注释:ctrl+shift+/取消注释:ctrl+shift+/列出所有快捷方式:ctrl+shift+l&&和&的区别:1)&&逻辑与运算符,&位与运算符2)&也可以进行逻辑运算,&不具有短路功能if((1==1)&(1==2))JavaEE@xuxiang 96Java/JavaEE学习笔记Jonny xuxiang5612@sina.com2、for循环for(定义集合中存放数据相同类型的变量:要遍历集合){}1)语法:for(variable : collection/Array){}2)比较1.jdk5.0之前for(Iterator iter=list.iterator;iter.hasNext();){Object o = iter.next();System.out.println(o);}2.jdk5.0之后for(Object o : list)System.out.println(o);注意:在迭代输出时不能删除元素----->缺陷3、类型安全的枚举类型1)enum:可以定义一个类型,而且还可以限制该类型的取值在某个范围内2)语法:enum enumName{枚举值1,...,枚举值n}3)适用位置:包中、类中,但不能在方法中4)注意:1.所有的enum类型都继承自java.lang.Enum;2.自定义的enum类型不能再有子类;3.枚举类型的取值默认为public static final;4.枚举类型中可以定义属性和方法;5.构造器必须是私有的;6.枚举类型的取值就是其实例对象,它会调用该枚举类型的构造器,还要实现枚举类型中所有的抽象方法;7.枚举类型可以实现其它接口;src--com.briup.day1--EnumTest--TafficLight--MyGrade--EnumSetTest--EnumMapTest--VarargsTest面试题:1.单例(单太)模式:饿汉式、懒汉式1)私有的构造器;JavaEE@xuxiang 97Java/JavaEE学习笔记Jonny xuxiang5612@sina.com2)私有、静态的属性(本类的类型);3)共有的方法暴露静态属性。举例:public class Student {private static Student s = new Student(); //饿汉式(懒汉式:private static Student s)private Student(){}public synchronized static Student newInstance(){if(s == null)s = new Student();return s;}public static void main(String[] args) {Student s1 = Student.newInstance();Student s2 = Student.newInstance();Student s3 = Student.newInstance();System.out.println(s1);System.out.println(s2);System.out.println(s3);}}2.谈谈java中的集合框架?根据集合存放数据的特点,分为两类:1)只存单值: List , SetArrayList:以数组的方式管理数据,线程不安全的,适合于做大量的查询操作;思考:怎么变成线程安全的(java.util.Collections)?-----> synchronized List(List<T> list)方法;LinkedList:线程安全的,以双向链表的方式管理数据,适合于做大量的增加、删除操作;Vector:不适合查询,线程安全的,适合处理多线程集合;2)存Key-Value键值对: MapHashMap(线程不安全的)Hashtable(线程安全的)TreeMap(根据HashCode进行排序)4、可变参数1)注意:1.可变参数只能用在方法的参数列表中2.可变参数可以指定0个或多个实参3.可变参数在参数列表中只能出现1次2)重载:1.发生在同一个类中2.相同的方法名JavaEE@xuxiang 98Java/JavaEE学习笔记Jonny xuxiang5612@sina.com3.不关心返回类型4.参数列表必须有所不同5.构造器也可以被重载3)重写:1.发生在父子类之间2.相同的方法名3.相同的返回值类型4.相同的参数列表5.可见性不能被缩小6.异常不能被扩大7.final方法不能被重写(也叫覆盖)8.静态方法不能被覆盖,但可以被子类中同名的方法所隐藏切记:1.所有的属性取决于编译时类型2.所有的静态方法取决于编译时类型3.所有的普通方法取决于运行时类型(多态)作业:1.String,StringBuffer,StringBuilder的区别?String:不可变字符串(固定字符串),在大量字符串进行连接时不使用String;StringBuffer:Java5中的可变字符串,线程安全的,不考虑线程的时候使用;StringBuilder:线程不安全的,性能较高,考虑多线程的情况下进行大量字符串连接时使用;2.纸牌游戏:52张牌发给4个人,每人10张牌型:13(枚举)花色:4(循环)String s = "ACE of Hearts"; //表示红桃A,其它自己想注意:所有牌放到集合中(准备牌);如何打乱集合顺序(洗牌):java.util.Collections ---> shuffle(注意与java.util.Collection的区别);如何去掉集合中部分元素(发牌):subString,subList.day25、静态导入(static import):1)语法:import static ...2)功能:并没有增加大的功能性的改进,只是允许我们将静态的属性和方法导入到程序中,以简化我们的编程;3)注意:1.import导入的是包中的类或接口;JavaEE@xuxiang 99Java/JavaEE学习笔记Jonny xuxiang5612@sina.com2.import static导入的是类或接口中静态的属性和方法。src--com.briup.day2--StaticImportTest;--MyStatic6、格式化输入输出&Scanner(引入C和C++中的printf):1)格式化输出语法:System.out.printf(format(格式),args(参数),...);2)format格式:[argument][flag][width(宽度)][.precision(精度)]type%[flag][width][.precision]type1.type:是必须的,如:%d %s %f,注意有几个百分号后面就跟几个参数。2.argument:利用“<”重复传入上一个参数值,而不是传入下一个参数3.flag:指定输出格式化的标记,如:"%-5s"中的“-”表示字符左对齐;“+”表示输出的数字带+号。4.width:指定输出字符的宽度,表示字符的个数,如"%5s"中的"5"表示字符宽度为5。5..precision:表示小数的位数,如"%5.2f"中的“.2”表示输出2位小数。3)Scanner:用于输入的类,可以利用他获得从键盘上输入的信息例如:Scanner s = new Scanner(System.in)//获得字节流int n = s.nextInt();练习:接收键盘输入,然后将内容打印在控制台上(System.in);用java.util.Scanner完成同样的功能(参考API);7、从控制台上向java程序内部传递参数有几种方式?1)应用程序参数run...--->Java Application--->右键New(ArgTest)--->Arguments--->Program aguments--->briup1 briup2 briup3在程序内部通过main中args取得:如java Test briup1 briup2 briup32)虚拟机参数java -Dname=briup -Dage=10在程序内部通过java.util.Property prop = System.getProperties();获取例:Properties.load(new FileInputStream(zh.property));Properties(key,value);Properties.getProperty(key);Name:JavaEE@xuxiang 100Java/JavaEE学习笔记Jonny xuxiang5612@sina.comzh.propertyname=名字:en.propertyname=Name:-Dname=briup-Dage=10第三章 泛型1、泛型:1)定义:即参数化类型,允许我们对放入集合中的具体类型进行限制;2)语法:类名/接口名<类型参数>;例如List<Student>;3)优点:1.使用泛型可以保证你的代码是类型安全的,类型检查会在编译阶段完成,在运行时不会出现ClassCastException;2.可以增加程序的可读性;4)运用:实际的开发中,主要运用在集合(Collection)中HashSet TreeSet ArrayList LinkedList2、子类型1)对象类型和引用之间可以有继承关系;2)对象类型和引用类型的类型参数间不能有继承关系;3)放到集合中的元素的类型为类型参数本身,或者是其子类型。3、通配符<?>当集合中的具体类型不确定时,我们可以使用通配符,表示集合中可以存放所有Object及其子类型的元素;4、限制通配符<? extends typeName>表示集合中的元素为typeName所指定的类型,或其子类型;限制类型是在定义自己的泛型的时候使用的;自己定义的泛型的语法:1)没有使用限制的情况下modiflers keyword(class/interface) ClassName/InterfaceName<E>/<K,V>E,K,V表示占位数量决定于开发应用需求2)对于泛型类型有限制的情况modiflers keyword(class/interface) ClassName/InterfaceName<T extends SuperClass>T表示占位,可以接受父类以及所有的子类JavaEE@xuxiang 101Java/JavaEE学习笔记Jonny xuxiang5612@sina.com5、定义泛型类1)声明一个类/接口,后面加上泛型信息: class A<E>{}2)类型参数一般用一个大写字母表示,只表示一个占位作用;3)在整个泛型类中,我们都可以使用该类型参数;4)类型参数的实际类型,由调用者在调用时给出。Map.Entry--EntryMap6、裸类型1.定义:类/接口使用时,如果没有给出泛型信息,我们就称之为裸类型;2.裸类型在使用时是类型不安全的,在运行时可能会出现ClassCastException.7、类型擦除泛型只在编译阶段起作用,在编译阶段编译器通过泛型信息来进行类型检查;在运行阶段所有的泛型信息都不存在了,即在.Class文件中所有的泛型信息已经被剔除掉了--TypeEraseTest.java练习:1.有两个字符串,a="1983年03月20日",b="2008年08月08日",问两个字符串所指代的日期相差多少天(java.text.SimpleDateFormat)?2.如何用最简单的方法构建多个内容相同的对象,要求对一个对象内容的修改,不会影响到其它对象?(涉及到java克隆机制)Student s1 = new Student("briup",10,...);Student s2 = s1;s1.setName("ibm");s2.getName();3.求某一年是否是闰年,给出程序(java.util.GregorianCalendar)。闰年:4年闰,100年不闰,400年闰。day3第四章 Annotation1、Annotation(标注、注释):1)概念:是对java中注释功能的增强,可以用来对类、属性、方法等进行标注;2)功能:使用Annotation可以改变我们的编程风格,允许我们进行声明式编程,我们只要给出声明,大量的代码可以由工具帮我们自动产生;Employee{String name;JavaEE@xuxiang 102Java/JavaEE学习笔记Jonny xuxiang5612@sina.comint age;...transient double salary;}2、Sun公司给出的标准Annotation:1)@Deprcated:用来标识类、属性、方法等。已经过时,不建议使用了。---> StandardAnnotation2)@Override:用来标识某一个方法是重写父类中的方法,编译器会看到此标识会自动检查该方法是否满足重写要求。3)@SuppressWarnings('unchecked'):禁止产生警告信息Warning:警告,可以不进行处理.引申:ErrorException(异常)1.checked exception:必须要处理,要么try...catch捕获,要么throws向上抛出(冒泡处理机制);如IOException注意:1. try{...}finally{...} 没有catch块也是可以的2. interface A{public void say() throws e1;}interface B{public void say() throws e2;}interface C extends A,B{public void say() throws ...?}a.如果e1(父类)和e2(子类)有继承关系,抛e2或不抛;b.如果e1和e2没有继承关系,不抛。2.unchecked exception:可以不进行处理,如NullPointerException,ClassCastExeption3、相关知识:1)POJO:Plain Old Java Objectcom.briup.pojo2)javadocJavaEE@xuxiang 103Java/JavaEE学习笔记Jonny xuxiang5612@sina.com4、定义Annotation1)说明:1.Annotation是一种特殊的接口;2.使用@interface声明Annotation: public @interface Info{}---> Info3.Annotation中可以包含方法(元素);4.Annotation中的方法不能有参数,不能抛异常;5.Annotation中方法的返回值类型有限制,只能是primitives,String,Class,enums,annotaions或者是以上类型的数组;6.Annotation的方法可以有默认值:methodName() default defaultValues;2)使用Annotation1.Annotation的使用和public、static、final等类似,可以对类、属性、方法等进行修饰、限制2.使用语法:@annotationName(methodName = Value,...methodName = value)5、Annotation分类1)标记Annotation:1.在Annotation中没有任何方法(元素),只起到一个标识作用2.语法:@interface annotationName{}3.使用:@annotationName(),如@Deprecated,@Override2)单值Annotation:1.在Annotation中只有一个方法(元素)2.语法:@interface annotationName{String value();}3.使用:@annotationName("value");如:SuppressWarnings("unchecked")3)普通Annotation:1.在Annotation中可以出现多个方法(元素)2.语法:@interface annotationName{JavaEE@xuxiang 104Java/JavaEE学习笔记Jonny xuxiang5612@sina.commethod1;...methodn;}3.使用:@annotationName(method1 = value,...methodn = value)如:@Info6、Meta-Annotation:元Annotation1)作用:用来描述、限制其它Annotation的Annotation2)Sun公司提供了两个常用的元Annotation:1.@Retention用来描述、限制Annotation的持久力,即Annotation的有效时长取值:a.SOURCE:表示Annotation只在原文件中有效b.CLASS:表示Annotation在编译阶段有效,默认取值c.RUNTIME:表示Annotation在运行阶段有效语法:@Retention(...)@Retention对应java类:java.lang.annotation.Retention;取值对应java类:static java.lang.annotation.RetentionPolicy.*;2.@Target用来描述、限制Annotation所修饰的对象取值:a.TYPE:表示该Annotation可以修饰class,interface,enum类型b.FILED:表示该Annotation只能修饰属性c.METHOD:表示该Annotation只能修饰方法......@Target对应java类:java.lang.annotation.Target;取值对应java类:static java.lang.annotation.ElementType.*;7、在程序内部处理Annotation1)reflect:反射Class Test{public static void main(String[] args){String name = args[0];JavaEE@xuxiang 105Java/JavaEE学习笔记Jonny xuxiang5612@sina.comClass.forName(name).newInstance();}public void hello(){}}2)获取镜像:Test a = new Test();1.Class.forName(className);2.a.getClass();3.Test.class;3)java.lang.reflect.*;MethodFeild---> MetaTest作业:1.谈一下深度克隆(深拷贝)和浅克隆(浅拷贝)?2.1)写一个Annotation,并用@Retention,@Target进行限制?2)写一个有多个方法的类A,对类中的部分方法用Annotation进行修饰?3)再写一个测试类,统计一下类A中有多少个方法被Annotation修饰,有多少方法没被Annotation修饰,并用反射调用一下所有被Annotation修饰的方法?