您的位置:首页 > 职场人生

黑马程序员->java增强 (1

2012-10-07 01:18 239 查看
--------------------android培训java培训、期待与您交流! ------------------

----------------javaenhance 笔记

1...MyEclipse 的快捷方式设置。

// 输入syso 加 alt+/ 即可自动生成 System.out.println(); 输出语句。

选中要注释的语句,Ctrl + Shift + / 即可自动生成。

Window 菜单下的

Preferences 选项中的

General 下的

Keys 中的

Content Assist 该项中的快捷键设置

/// 模版设置

Window

|-Preferences

|-Java

|-Editor

|-Templates 模版设置,要新建模版 new 一个

2....Eclipse 调试

//双击程序行打个断点。

//右键选择 debug as 调试视图

//右键想看的变量选择 watch

//单步执行看结果

3...静态导入

//import static

4...可变参数

//特点:只能出现在参数列表的最后。

... 位于变量类型和变量名之间,前后有无空格都可以。

// 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

5..for 循环增强

// 语法:

for (type 变量名:集合变量名 ){...}

// 注意;

// 迭代变量必须在()中定义。 集合变量可以是数组或是实现了Iterable 接口的集合类。

6..基本数据的自动拆箱与装箱

// 自动装箱

Integer num1 = 12;//这在以前的版本中是不允许的,必须要先new Integer 对象。

// 自动拆箱

System.out.println(num1+12);

7..享元模式 flyweight

// 有很多小的对象,都相同,将之变成同一个对象。

8..枚举类

8...1.//枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在

// 编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

8.2..用普通类如何实现枚举功能,定义一个 Weekday 的类来模拟枚举功能。

@私有的构造方法。

@每个元素分别用一个共有的静态成员变量表示。

@可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。

//枚举类

public enum WeekDay{

SUN(),MON,TUE,WED,THI,FRI,SAT;

}//枚举元素后跟括号,就可指定构造时使用哪个构造方法。

'枚举只有一个成员时,就可以作为一种单例的实现方式。

9..反射

9.1..反射的基石--》Class类

@Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是 Class

//Java 类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是有这个类的实例

//对象来确定的,不同的实例对象有不同的属性值。 Java 程序中的各个 Java类,他们是否属于同一类事物,是不是可以用

//一个类来描述这类事物呢?这个类的名字就是 Class,要注意与小写 class 关键字的区别。

9.2..如何得到各个字节码对应的实例对象?

'类名.class , 例如,System.class

'对象.getClass(),例如,new Date().getClass()

'Class.forName("类名"),例如,Class.forName("java.util.Date");

//第三种比较常用。--因为不知道以后别人会创建什么类。

9.3..九个预定义Class 实例对象。

//参加 Class.isPrimitive 方法的帮助。

byte ,short ,int ,long ,boolean ,char ,float ,double ,void

//int.class == Integer.TYPE

/*反射就是把Java类中各种成分映射成相应的 java 类。例如,一个 Java 类中用一个 Class 类的对象来表示,一个

类中的组成部分:成员变量,方法,构造方法,包 等等信息也是用一个个的java类来表示,就像汽车是一个类,

汽车中的发动机,变速箱等等也是一个个的类。表示 java 类的Class 类显然要提供一系列的方法,来获得其中

的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示。

*/ 它们是 Field , Method , Constructor , Package 等等。

9.3.1.. Constructor 类

Constructor 类代表某个类中的一个构造方法。

@得到一个类所有的构造方法:

Constructor[] constructor = Class.forName("java.lang.String").getConstructors();

@得到某一个构造方法;

Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);

//一个类中有多个构造方法,根据参数的个数和类型可以区分想得到其中的某个方法。

@创建实例对象:

通常方法: String str = new String(new StringBuffer("avi"));

反射方法: String srt = (String)constructor.newInstance(new StringBuffer("avi"));

Class.newInstance()方法:

例: String obj = (String)Class.forName("java.lang.String").newInstance();

//该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。

//该方法内部用到了缓冲机制来保存默认构造方法的实例对象。

9.3.2..Field 类

//反射得到类的成员变量

ReflectPoint rp = new ReflectPoint(3, 5);//x 是私有的,y 是公有的。

Field rpY = rp.getClass().getField("y");

System.out.println(rpY.get(rp));

Field rpX = rp.getClass().getDeclaredField("x");

rpX.setAccessible(true);//暴力反射,将 x 设置成可以访问。

System.out.println(rpX.get(rp));

9.3.3..Method 类

Method 类代表某个类中的一个成员方法。

@得到类中的某一个方法:

Method chatAt = Class.forName("java.lang.String").getMethod("charAr",int.class);

@调用方法

通常方法:System.out.println(srt.charAt(1));

反射方法:System.out.println(charAt.invoke(str,1));

//如果传递给Method对象的invoke()方法的一个参数为null,说明给Method对象对应的是

//一个静态方法。

'jdk1.4和 jdk1.5 的 invoke 方法的区别:

jdk1.5 : public Object invoke(Object obj,Object... args);

jdk1.4 : public Object invoke(Object obj,Object[] args);

//按1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用

//方法中欧个的一个参数,所以,调用charAt 方法的代码也可以用 jdk 1.4 改写成

charAt.invoke("str",new Object[]{1});形式

9.3.4..数组的反射

@具有相同维度和元素类型的数组属于同一个类型,即具有相同的Class实例对象。

@代表数组的Class实例对象的getSuperClass()方法返回的父类为 Object 类对应的Class。

@基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;

@非基本类型的一维数组,既可以当作Object类型使用,又可以当作Object[]类型使用。

@Arrays.asList()方法处理 int[] 和 String[] 时的差异。

@Array工具类用于完成对数组的反射操作。

9.4..反射的作用--》实现框架功能

'框架与工具类的区别,工具类被用户的类调用,而框架则是调用用户提供的类。

@因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象,而要使用反射方式

@来做。

Class.forName("类名").newInstance();

//反射方法创对象,"类名"是后期传入,

Class.forName("")//获得的是类名的字节码实例对象。

.newInstance();//调用的Class的方法,目的为获取该类空参的构造函数,并用空参构造函数创建对象。

9.5..内省 IntroSpector

'如果第二个属性是小的,则把第一个字符变成小的。

JavaBean 是一种特殊的 Java类,主要用于传递数据信息,这种java类中欧过的方法主要用于访问私有的字段,且方法

符合某种命名规则。

如果要在两个模块之间传递多个信息,可以将这些信息封装到一个 JavaBean 中,这种 JavaBean 的实例对象通常称之

为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过

一些相应的方法来访问。JavaBean 的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。

去掉set前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。

//一个类被当作JavaBean使用时,javaBean的属性是根据方法名推断出来的,根本看不到java类内部的成员变量。

一个符合JavaBean特点的类可以当作普通类一样进行使用,但把他当作JavaBean用坑顶需要带来一些额外的好处:

@在javaEE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作。

@JDK提供了对JavaBean进行操作的一些API,这套API就称为内省。用内省这套API操作JavaBean比用普通类方式更方便。

9.5.1..BeanUtil

10................注解

10.1..'注解相当与一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。

以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去

干响应的事。标记可以加在包,类,字段,方法,方法的参数上以及局部变量上。

//java.lang 包中,JDK 中提供了最基本的 annotation.

@suppressWarings 该标记告诉编译器,不要再提醒方法过时的警告。

@Deprecated 该标记告诉编译器和后人,本类方法等已过时,用时请小心。

@Override 该标记有助于,在覆盖父类方法时,是否完全覆盖父类参数类型和个数的错误。

10..2..'注解就相当于一个你的源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好了这个注解类。

//就像你要调用某个类,得先开发好这个类。

注解上的注解,用于说明该注解在什么状态是有效。称为元注解。//注解的生命周期。

@Retention 元注解 //该注解有三种取值:

@Retention(RetetionPolicy.SOURCE),

//对应 java 源文件。

@Retention(RetetionPolicy.CLASS),

//对应 class 文件。

@Retention(RetetionPolicy.RUNTIME)

//对应 内存中的字节码。

@Target 元注解

@Target(ElementType.METHOD)//标明该注解用在什么上面。可选项有方法,变量,构造函数,包,等。

元注解以及其枚举属性值不用记,只要会看JDK 提供那几个基本注解的API帮助文档的定义或其源代码。

//可查询 java.lang.annotation 包下面的类。

1...为注解增加属性。定义基本类型的属性和应用属性。

在注解类中增加 String color();

@MyAnnotation(color= "red")

2...用反射方式获得注解对应的实例对象后,在通过该对象调用属性对应的方法。

MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);

3...为属性指定缺省值。

String color() default "yellow";

如果注解中有一个名称为 value 的属性,且你只想设置 value 属性(即其他属性都采用默认值或者你只有一个

value 属性),那么可以省略 value= 部分,例如;@MyAnnotation("lizi")

4...数组类型的属性//为注解增加高级属性

int[] arrayAttr() default {1,2,3};

@MyAnnotation(arrayAttr = {2,3,5})

//如果数组属性只有一个元素,这时候属性值部分可以省略大括号。

5...枚举类型的属性

EnumTest.TrafficLamp lamp();

@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)

6...注解类型的属性

MetaAnnotation annotationAttr() default @MetaAnnotation("xxx");

@MyAnnotation(annotation=@MetaAnnotation("yyy"))

//可以认为上面这个@MyAnnotation 是MyAnotation 类的一个实例对象,同样的道理,可以认为上面这个

//@MetaAnnotation 是 MetaAnnotation 类的一个实例对象。

'枚举和注释都是特殊的类,不能用 new 创建它们的实例对象,创建枚举的实例对象就是在其中增加元素。

在程序中直接用 @放上一个标记即可创建出一个注解的实例对象。

----------------------android培训java培训、期待与您交流! --------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: