黑马程序员——java高新技术(上)
Java高新技术
主要讲述的是Eclipse的操作, JDK1.5的新特性(静态导入 、可变参数、自动装箱拆箱 、增强for循环 、枚举、注解和泛型等),反射,框架,内省,泛型和代理等内容。
Eclipse IDE:--->Itegrity Development Environment
l 更改工程(项目)名:右键—refactor—rename
l 注释段落 快捷键:ctrl+shift+/ 效果是:/* */
l 透视图,Eclipse怎么调试变量:右键—Debug As—选中变量—选watch—在debug透视图里可以看
l 新开的工作间,设置快捷键:Window—preference—General—Key 如,Alt+/ 是快捷输出Sop
l 代码模板设置:Window—preference—java—editor—Templates
l 设置JVM内存的大小: JVM默认的内存大小为64M。
设置JVM内存大小的方法是:在所作的项目上面右键--->Run As--->Run Configurations... --->Arguments--->VM arguments,在下面输入如下命令:-Xmx1024m,后面的数字可以根据自己的实际情况来设置(这里设置的大小是1024M,即1G),点击 Run,就行了。
l 修改Eclipse的编码方式:如果要使新建立工程、java文件直接使UTF-8则需要做以下工作:
1、windows->Preferences...打开"首选项"对话框,左侧导航树,导航到 general->Workspace,右侧Text file encoding,选择Other,改变为UTF-8,以后新建立工程其属性对话框中的Text file encoding即为 UTF-8。
2、windows->Preferences...打开"首选项"对话框,左侧导航树,导航到 general->Content Types,点开Text,选择Java Source File,在下面的Default encoding输入框中输入UTF-8,点Update,则设置Java文件编码为UTF-8。
- 静态导入——>不用在使用其他类的静态成员变量,前缀其类名.这将使代码更简洁, 提高编码效率。
使用import static 引入静态成员。其中import static java.lang.Math.*;就是静态导入的语法,它的意思是导入Math类中的所有static方法和属性。 这样我们在使用这些方法和属性时就不必写类名。
需要注意的是默认包无法用静态导入,另外如果导入的类中有重复的方法和属性则需要写出类名,否则编译时无法通过。
- 可变参数——>参数个数不确定,类型确定的情况, 减少代码量,方便输入
以往版本的Java中,通常的做法是将多个参数放在一个数组或者对象集合中作为参数来传递,1.5版本开始有可变参数。参数个数不确定,类型确定的情况,java把可变参数当做数组处理。
可变参数的特点: 减少代码量,方便输入
u 只能出现在参数列表的最后 如:public static int add(int x,int ... args)
l ···位于变量类型和变量名之间,前后有无空格都可以;
l 调用可变参数的方法时,编译器为该变量参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
- 增强for循环——>-减少迭代器(iterator)的潜在错误
For(type 变量名 :集合变量名){···} type是变量类型
如:for(int arg : args ) {···}
- 基本数据类型的自动拆箱和装箱——>无需在基本类型(例如double)和包装类型(例如Double)之间人工地进行转换。 方便了基本类型数据和它们包装类地使用
Integer iObj = 3; //将一个基本数据类型自动装箱
System.out.println (iObj + 12); //自动拆箱
Flyweight享元模式: 有很多小的对象,它们有很多相同的属性,把这些相同的属性变为同一个对象,称为内部状态。 把那些不同的属性变为方法的参数,称为外部状态。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件; 常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
- 枚举 (Enum)——> 对值的范围进行限定 ,提高安全性
枚举类型相当于自己定义一个数据类型,而这个数据类型的名字是自己起的,类型里面的内容也是自己定义的,当用到这个类型的变量时,只能输入已经定义好的内容,这样就可以防止其他程序员输入不符合规定的值.
为什么要有枚举:
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。
枚举可以让编译器在编译时就可以控制源程序填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。枚举元素必须位于枚举体中的最开始部分。
它也可以定义构造方法(必须私有)、成员变量、和抽象方法。
枚举总结
1.构造方法必须定义成私有的
2枚举元素必须位于枚举体中的最开始部分。最后一个枚举元素后面加分号
3.只要用到枚举类,枚举类里的元素都会初始化,调用无参的构造方法
4.如要调用有参,在元素后面加括号——>里面传入相应的类型参数
5.枚举里只有一个元素时,就可以作为一种单例的实现方式。
如:public enum Weekday{
SUN,MON,TUE,WED,THI,FRI,SAT;
}
- 反射———>反射:反射就是把java类中的各种成分映射成相应的java类。
① 反射的基石—>Class类:
如: 人———>Person——>张三、李四(实例对象)
Java类—>Class———>各个类在内存中的字节码(实例对象)
② 字节码:一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码。
不同的类的字节码不同
③ 获得一个类的字节码有三种方法:
a ---- 类名.class,如System.class
b ---- 对象.getClass(),例如new Person().getClass();
c ----- Class.forName("类名")此方法是Class类的静态方法,它的作用就是返回字节码 ,返回方式有两种:
l I 这个类的字节码被加载过,已存在于Java虚拟机里(内存里),直接返回;
l II这个类还没有被Java虚拟机加载过,先用类加载器去加载,把加载进来的字节码缓存在Java虚拟机里。
④ 九个预定义的Class实例对象—void 和八个基本数据类型(boolean,byte,char,short,int,long,float,double)
一个class代表一份字节码,一个method代表这个字节码的一个方法,一个constructor代表字节码中的一个构造方法。
反射的作用:反射的作用—实现框架的功能 用于工具,架构,动态开发等开发工程
对字节码的比较要用 == ,判断某个字节码是不是某种类型(类名.getType() == 类型名.class )
- Constructor类
Constructor类代表某个类中的一个构造方法
getConstructors(); newInstance();
在调用Class的该方法时,该方法内部先得到了默认的构造方法,用缓存机制将该构造方法缓冲起来,然后用该构造方法创建实例对象。
- Field类
Field 代表字节码里的变量,不代表对象里的某个变量
得到的Field对象是对应到对象上的成员变量 。
setAccessible(true);暴力获取私有变量,可以使用了
get(obj);获取对象obj中的变量的值。
- Method类
Method类代表某个类中的一个成员方法
public Object invoke(Object obj,Object... args);//obj:调用方法的对象
- 数组的反射
Array工具类用于完成对数组的反射操作,用Array工具类:
思路:将一个数组转化为对象obj-->用对象获取字节码文件,判断是否为数组Class-->是,Array.getLength(obj)获取长度,for循环一个个输出数组元素Array.get(obj,index);否,直接输出obj。
①如果数组的维数和类型都相同,则所得字节码就相同(即具有相同的Class对象 )
②基本数据类型的一维数组可以被当作Object,不可以被当作Object[],
非基本类型的既可以被当作Object使用,又可以被当作Object[]使用;