黑马程序员-JAVA学习日记
黑马程序员_JAVA学习日记_JAVAJDK1.5以后高新技术
------- android培训、java培训、期待与您交流! ----------
1.静态导入:
语法:import static 包名.类名。静态属性|静态方法|*
静态导入就是在调用静态方法时不用再写类名了,直接调用。
导入某个静态方法:import static java.lang.Math.max;
导入所有的方法:import static java.lang.Math.*;
2.可变参数和OverLoad:
可变参数的特点:1.只能出现在参数列表的最后;
2....位于变量类型和变量名之间,前后有无空格都可以;
3.调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
格式:public static int add(int x,int... args){
int sum=x;
for(int i=0;i<args.length;i++){
sum+=args[i];
}
}
3.for循环增强:
语法:for(type 变量名:集合变量名){...}
注意事项:迭代变量必须在()中定义;集合变量可以是数组或实现了Iterable接口的集合类!增强for循环中,在变量名前可以加修饰符,比如final修饰符,可以被局部内部类访问。 这个可迭代的集合必须要实现Iterable接口!才可以实现增强for迭代。 4.基本数据类型的装箱和拆箱:
JDK 5.0以后创建一个Interger对象,可以简写为:Integer iObj=3;也可以进行直接加法运算:即 (iObj+12);
在Integer i1=13;
Integer i2=13;
则这两个是同一个对象是在-128~127之中时是,超出范围就不是了, 和String不同。
这是一种设计模式:是享元模式,在很多的小对象经常被用到时,就将他们封装成一个对象。好处就是节省了内存。
还有:英语是:flyweight。有很对小的对象,他们有很多的属性都相同,把它们变成同一个对象,
哪些不同的属性把它们变成方法的参数,称之为外部状态,他们相同的属性叫做内部属性。
在一个字节范围内,就是在-128~127之间,Integer i1=Integer.valueOf(4);
Integeri2=Integer.valueOf(4);是同一个对象。
5.枚举:
为什么有枚举:因为枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器会报错。
枚举可以让编译器在编译的时候就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
用普通类如何实现枚举功能呢,定义一个Weekday的类来模拟枚举的功能。
私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法,例如,要提供nextDate方法必须是抽象的。
问题:子类在父类中能创建匿名内部类吗?
普通类来模仿枚举:可以参照java.awt.Color类
采用抽象方法定义nextDay就将大量的if else语句转移成了一个个独立的类。\
如果想在一个类中编写完成各个枚举类和测试调用类,那么可以将枚举类定义成调用类的内部类。
枚举的基本应用:举例:定义一个Weekday的枚举
扩展:枚举类的values,valueOf,name,toString,ordinal:排行第几,等方法
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,
例如:可以调用WeekDay.SUN.getClass().getName和WeekDay.class.getName().
JAVA5的枚举的基本应用:
枚举类型是单例模式的。你需要实例化一次,然后再整个程序之中就可以调用他的方法和成员变量了。
枚举类型使用单例模式是因为他的值是固定的,不需要发生改变。
枚举类也是一个类当然可以实现一个接口也可以在其中定义构造方法,方法,和内部类
6.Enum要点
1、在程序中可以使用一个枚举类来指定对象的取值范围。
2、在Java中使用enum关键字定义一个枚举类,每一个枚举类都是继承Enum类。
3、在枚举中可以通过values()方法取得枚举中的全部内容。
4、在枚举类中可以定义构造方法,但在设置枚举范围时必须显式地调用构造方法。
5、所有的枚举类都可以直接使用Comparable进行排序,因为Enum类实现了Comparable接口。
6、Java类集中提供枚举的支持类是EnumMap、EnumSet。
7、一个枚举类可以实现一个接口或者直接定义一个抽象方法,但是每个枚举对象都必须
分别实现全部的抽象方法。
枚举实际是一个类,它中的元素其实是一个对象实例!
枚举中直接打印就是指定的字符串对象,这是因为枚举中复写了toString()方法。
带有构造方法的枚举类:枚举用enum表示,枚举类。
带构造方法的枚举:
构造方法必须定义为私有,枚举元素MON和MON()的效果一样。都是调用默认的构造方法。
必须位于元素列表之后:元素列表之后如果有东西必须要有”;“,
构造方法必须是私有的。构造方法可以带参也可以不带参,元素对象调用的时候,无参调无参,有参调有参。
带有抽象方法的枚举:
枚举中的成员就是这个枚举类的对象。
枚举是内部类,枚举都是内部类。
枚举的内部方法是抽象的,为什么枚举类不是抽象的?
枚举就相当于一个类,其中也可以定义构造方法、成员变量,普通方法和抽象方法,
枚举元素必须位于枚举体中的最开始部分枚举元素列表的后边有分号与其他成员分隔,把枚举
中的成员和变量等放在枚举元素的前面,编译器会报错。
枚举只有一个成员时,就可以定义为一种单例的实现方式。
因为:构造方法是私有的,对象私有就是枚举中的元素就是是自然元素。已经有了!
枚举中的元素就是一个对象,直接就是得到这一个对象。
JAVA 中d的Junit是测试类工具:
在测试方法要写上注解:@Test 在测试方法。需要导包和导JUnit 4。
Junit类中的两个方法,before()和after()一个在测试方法之前运行一个在测试方法之后运行,在before中建立对象就不用再每个要测试的方法中创建对象了。after()是释放资源的。
将before 和 after 加上静态就是随着类的加载就运行了,只运行一次,而不加则运行多次。
Assert 断言。判断返回值和期望值是否相同,还有很多的方法。
JAVA中的反射: 在JDK1.2就有了,用于:各种开发工具中。
任意一个类型都有对应的静态class属性。即类型名.class就是该类型的Class对象。
但是:getClass和.class都要使用即先加载类型对象。
Class类:是反射的基石,Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这类的实例对象来确定的,不同的实例对象有不同的属性值。JAVA程序中的各个java类,他们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意小写class关键字的区别。Class来描述类的名字,类的访问属性,类所属于的包名,字段名称的列表,方法名称的列表等等。
学习反射首先要明白Class这个类。
得到Class对象的方式:用对象.getClass();
Class.forName("java.lang.String")做了两件事:1.字节码没有加载进内存中法,用类加载器加载加载进内存,把加载进内存中的字节码进JVM中,以后就不用加载了。2字节码已经加载进内存中,直接找到字节码的名称直接返回就行。
得到字节码的三种方式:
1.类名.class;例如:System.class
2.对象.getClass(),如:newDate().getClass()
3.Class.forName("类名"),例如:Class.forName("java.util.Date");
九个预定义的Class实例对象:
有八个基本数据类型,他们对应的都有Class对象。void也有对应的Class对象。
Stringstr1="abc";
Class.isPrimitive();判断是否为基本类型的字节码
Integer.TYPE表示包装的基本类型数据
数组也是一种类型,判断是否为数组用isArrary();
int.ckass==Integer.TYPE为假。
总之:只要是在源程序中出现的类型,都有各自的Class实例对象,例如int[],void...
7.反射:
概念:
反射就是:把JAVA类的各种成分映射成相应的java类。
反射中的另一个类:Constructor类代表摸个类中的一个构造方法:
方法:得到某个类的所有的构造方法:
Constructor[]constructors=Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
Constructorconstructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);
创建实例对象:
forName()传入的必须是全类名,扩展性最强。
通常方式:String str=new String(newStringBuffer("abc"));
反射方法:String str=(String)constructor.newInstance(newStringBuffer("abc"));
一个类有多个构造方法,根据参数的个数和类型:例如:Class.getMethod(name.Class...args)中的args参数就代表索要获取事物那个方法的各个参数的类型的列表。重点:参数类型用Class实例对象表示。
如:int.class,(int[]).class
int[]ints=new int[0];
ints.getClass();
Constructor对象代表一个构造方法,他有的方法:得到名字,得到所属的类,产生实例对象。
Class.newInstance()方法:
例如:String obj=(String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
该方法内部的具体代码体现:用到了缓存机制来保存默认的构造方法的实例对象。
File类表示类的成员变量:
对于公有的成员直接用对象名.getClass().getField("成员变量名");
获得是用对象名.get(类型的对象名);
对于私有的则是getDeclaredField();还要将其设置为可见的setAccessible(true);暴力访问。
在反射中如果字节码是一份就用==来比较,不使用equals,==比较准确,因为是一份字节码。
成员方法的反射Method类:代表某个类中的一个成员方法得到类中的方法:Method charAt=Class.forName("java.lang.String").getMethod("charAt".int.class);
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));
如果传递给Method对象的invoke()方法的一个参数为null,这说明该Method对象对应的是一个静态方法!
jdk1.4和1.5的区别是1.5有了可变参数;1.4是用newObject[]{2};
用反射方式执行某个类中的main方法:
在传递参数时:1.将参数数组在打包成Object数组,在调用时他会拆包将数组作为参数传递。
2.将数组转化为对象,(Object)数组这样调用,是一个对象,就不会再拆包了。
数组的反射:Arrays中有个aslist方法:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不可以当作Object[]类型使用;非基本类型的一维数组,既可以
当作Object类型使用,又可以当作Object[]类型使用。
Arrays.asList()方法处理int[]和String[]时的差异。
Array工具类用于完成对数组的反射操作。
怎么得到数组中的元素类型?没有办法得到数组中的类型;但是可以得到某个元素的类型。
ArrayList_HashSet的比较及Hashcode分析:
反射的综合案例:反射的作用-实现框架功能;
框架和工具类的区别:工具类是被用户的类调用,而框架则是调用用户提供的类。
当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段里,否则,对象修改后的哈希值于最初存储进的HashSet集合时的哈希值就不同了,即使使用contains方法是用该对象的当前引用作为的参数去HashSet集合中搜索对象,也将返回找不到的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存溢出。
这个例子可以说明很多问题:1,内存为什么溢出,java中有内存溢出。
2.hashCode的作用,
3,集合中ArrayList和HashSet的应用。
内省英文单词为:IntroSpector:----- JavaBean
1.如果要在两个模块之间传递多个信息,可以将这些信息封装到一个类中,这个类的实例对象统称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段类存储,
如果读取或设置这些字段的值,这需要通过一些相应的方法来访问。
2.JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则,JavaBean的属性是根据其中的setter和getter方法来确定的。而不是根据其中的成员变量。如果方法名为setld,中文意思极为设置id,
getRealPath()得到绝对路径;
一定要记住要用完整的路径,完整的路径不是硬编码,而是运算出来的。
框架中的配置文件都放在classpath路径下;
getClassLoader()类加载器,getResourceAsStream();
代理:
交叉业务的编程问题即为面向方面的编程(Aspect oriented program 简称AOP),AOP的目标就是要使交叉业务模块化。可以采用将切面代码移动和原始方法的周围。这与直接在方法中编写切面代码的运行效果是一样的。
JVM可以再运行期动态生成类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。
JVM生成的动态类必须实现一个或多个接口,所以JVM生成的动态类只能用作具有相同接口的目标类的代理。
CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类的生成动态代理类,那么可以使用CGLIB库。
代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外,还可以再代理方法中的如下四个位置加上系统功能代码。
1.在调用目标方法之前
2.在调用目标方法之后
3.在调用目标方法前后
4.在处理目标方法异常的catch块中
------- android培训、java培训、期待与您交流! ---------- 详细请查看:http://edu.csdn.net/heima/