黑马程序员-张孝祥Java基础加强(PART1)

来源:互联网 发布:阿里云服务器隐藏ip 编辑:程序博客网 时间:2024/05/23 20:24

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------


知识点:

1.Java5的几个新特性,包括静态导入、可变参数、增强for循环、基本数据类型的自动装箱与拆箱、枚举;

2.反射;

3.内省;

4.注解。


一、Java5的新特性

1.静态导入

import语句可以导入一个类或一个保重的所有类,而import static语句可以只导入一个类中的所有或某个静态方法,这就是静态导入。静态导入某个类或静态方法之后,可以直接调用导入的静态方法无需通过类名。例如:


在上面的代码中通过import static java.lang.Math.*;语句导入了Math类的所有静态方法。也可以只导入某一个静态方法,如import static java.lang.Math.max;


2.可变参数

如果一个方法的参数个数不确定,可以使用可变参数,格式:参数类型... 变量名

特点:

(1)只能出现在参数列表的最后,如void method(int x, int... args);不可以写成void method(int... args, int x);

(2)...位于变量类型和变量名之间,前后有没有空格都可以;

(3)调用含有可变参数的方法时,编译器会为该可变参数创建一个隐含的数组,在方法体中可以通过数组的方式操作可变参数。

示例:


3.增强for循环
增强for循环的语法为for(type 变量名:集合变量名){...}。
示例:在可变参数的示例代码中,对可变参数的操作可以使用增强for循环
注意:
(1)迭代变量必须在()中定义;
(2)集合变量可以是数组或实现了 Iterable接口的集合类

4.基本数据类型的自动装箱与拆箱
所谓的自动装箱和拆箱,就是基本数据类型可以直接和对应的表示该数据类型的类进行赋值和运算操作,无需调用方法。
Integerint举例,Integer num = 12;就是自动装箱,System.out.println(num+12);就是自动拆箱。
示例:

在上面的代码中,当i1和i2的赋值是处于-128~127的范围之内的同一个数时,两者是同一个对象,否则两者是不同的两个对象。i3和i4的情况相同。这称为享元模式。
享元模式(Flyweight):如果有很多很小的对象,他们有很多相同的东西,那么就可以把他们相同的东西包装成一个对象,把不同的东西变成外部的属性,作为方法的参数传入对象。这样做的好处就是可以减少资源的浪费。

5.枚举
枚举就是让某个类型变量的取值只能是若干固定值中的一个。枚举就是一种特殊的类,其中的每个元素就是该类的一个实例对象。
(1)通过创建一个代表一周的普通类来实现枚举的作用

(2)枚举类的基本应用

(3)枚举的高级应用
枚举相当于一个类,可以在其中定义构造方法、成员变量、普通方法和抽象方法。但所有这些成员都必须放在所有枚举元素列表之后,通过分号相分离。
下面是一个表示交通灯的枚举类。

该枚举中的每个元素都是该枚举类的一个子类,并且是内部类,调用了父类(即该枚举)的有参构造,复写并实现了父类的抽象方法。调用方式,TrafficLamp.RED.nextLamp();
当枚举只有一个成员时,可以作为单例的一种实现方式。

二、反射
1.反射的基石——Class类

Class类是描述Java类这类事物的类,就好像Person类是描述人这类事物的类。Class类描述了类的名字、类的访问属性、类所属的包名、字段名称的列表、方法名称的列表等等。

一个类被类加载器加载到内存中,占用一片存储空间,这片空间里的内容就是类的字节码,不同类的字节码是不同的,这些字节码可以分别用一个对象来表示,这些对象显然具有相同的类型,这个类型就是Class类。也即是说,Class类是内存中字节码的抽象,Class类的实例对象就是对应类在内存中的字节码。一个类在虚拟机中通常只有一份字节码。

得到字节码对应的实例对象的(Class类型)的三种方法:

(1)类名.class,比如String.class

(2)对象.getClass(),比如new Date().getClass()

(3)class.forName(“完整类名”),比如class.forName("java.util.Date")

有九种预定义的Class对象,表示八种基本数据类型和void。这些类对象由Java虚拟机创建,与其表示的基本类型同名,即booleanbytecharshortintlongfloatdouble。需要注意的是int.class不等于Integer.class,因为Interger是引用数据类型,但是int.classInteger.TYPE相同,因为Integer.TYPE就是表示int的Class实例。其他类同。


注意:加载字节码并调用其方法,没有看到类的静态代码块被执行,只有当第一个实例对象被创建时,静态代码块才会执行。准确的说,静态代码块不是在类被加载的时候被执行的,而是在第一个实例对象被创建时才执行的。


2.反射

反射就是把Java类中的各种成分映射成相应的Java类。也就是说,Java类用Class类来表示,Java类中的组成部分,如成员变量、方法、构造方法、包等也用相应的类来表示,它们是Filed、Method、Constructor、Package等。一个类的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。

(1)Constructor类

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

(2)Field类

Filed类代表某个类中的一个成员变量。

定义一个ReflectPoint类进行演示。

下面是Filed类的示例代码

将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的“b”改成“a”。

(3)Method类

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

如果传递给Method对象的第一个参数为null,说明该Method对象对应的是一个静态方法。

(4)用反射方法执行某个类中的main方法

目标:通过用户提供的类名,执行该类的main方法。

先定义一个包含主函数的类

{CSDN:CODE:209806
调用主函数的代码

注意:Object和String具有父子关系,但Objec[]String[]没有父子关系,所在上面的代码中不能写成
mainMethod.invoke(null, new Object[]{new Object[]{"111","222","444"}});
mainMethod.invoke(null, (Object)new Object[]{"111","222","444"});
(5)数组的反射

(6)反射的作用——实现框架功能
什么是框架?
框架就好比开发商做的毛坯房,开放商将房子卖给用户,需要住户自己去装修,比如安装门窗。房子就是框架,用户将门窗插入框架中。
框架与工具类的区别:框架调用用户提供的类,工具类用户的类调用。
框架要解决的核心问题是什么?
我在写框架(盖房子)时,用户可能还在上小学,还不会写程序,那框架怎么调用用户后来写的类呢?因为在无法知道要被调用的类名,所以程序中无法直接new某个类的实例对象,需要通过反射方式来做。
示例代码:

三、内省(IntroSpector)

1.JavaBean

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类的方法主要用于访问私有的字段,且方法名符合某种命名的规则。

如果要在两个模块之间传递对个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,需要通过相应的方法来访问,即settergetterJavaBean的属性是根据其中的settergetter方法来确定的,而不是根据其中的成员变量。如果方法名为setIdgetId,那属性名就是id,也就是说去掉setget,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,就把首字母也改成小写,否则保持不变。如setId的属性名为id,isLast的属性名为last,setCPU的属性名为CPU。总之,一个类被当做JavaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到Java类内部的成员变量。

jdk中提供了对JavaBean进行操作的一套API,对JavaBean的操作就称为内省。


2.内省综合案例

首先更改ReflectPoint类,使其符合JavaBean的定义。



3.BeanUtils工具包

BeanUtils是Apache提供的一个操作JavaBean的工具包。

在上面代码的基础上,BeanUtils操作方式如下:

注意:使用BeanUtilsget属性时返回的结果为字符串,set属性时可以接收任意类型的对象,通常使用字符串;使用PropertyUtilsget属性时返回的结果为该属性本来的类型,set属性时只接受该属性本来的类型。


四、注解

1.了解注解以及几个基本注解

注解相当于一种标记,在程序中加了注解就相当于为程序打上了某种标记,以后编译器、开发工具和其他程序可以通过反射来了解你的类和各种元素上有无何种标记。标记可以加在包、类、字段、方法、方法的参数和局部变量上。

三种基本的注解:

@SuppressWarnings,压缩警告。比如调用一个过时的方法,编译器会发出警告,加上压缩警告的注解就不会了;

@Deprecated,表明该元素已过时。当别人再调用该方法是,编译器会给出警告。

@Override,表示覆盖。该注解可以防止,继承自父类的方法定义写错。

通过Class类的isAnnotationPresentgetAnnnotation方法可以判断和获取某个类中的注解。


2.自定义注解及其应用

@Retention@Target也是注解,称为元注解,即注解的注解。

@Retention表示注解存在的阶段,取值有三种,RetetionPolicy.SOURCERetetionPolicy.CLASSRetetionPolicy.RUNTIME,分别对应Java原文件、.class文件和内存。

@Target表示注解可以修饰的元素类型,取值有ElementType.TYPEElementType.FIELDElementType.METHODElementType.PARAMETERElementType.CONSTRUCTORElementType.LOCAL_VIRIABLEElementType.ANNOTATION_TYPEElementType.PACKAGE,,分别对应类(包括普通类,接口,注解、枚举)、字段、方法、参数、构造方法、局部变量、注解和包。


3.为注解增加属性

枚举的属性可以是基本数据类型、StringClass、枚举、其他注解,以及这些类型的数组。

如果注解中有一个名称为value的属性,且你只想设置value属性(其他属性都采用默认值或者只有一个value属性),那么可以省略”value=“部分。

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


---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

0 0