java高新技术1学习笔记整理
1:myeclipse是eclipse的功能扩展,直接下载myeclipse即可。myeclipse是一个用来编辑java程序的高级编程工具。集成开发工具(IDE)。一个相对独立的项目就相当于一个工程,一个工作间可以有
多个工程。
2:java中运行跟编译是2个不同的过程,运行跟编译可以由不同版本的程序来执行。
3:对工程 、包、 类、 或类中的某个变量重构名字可以右键该对象点refactor中的Rename;
4:给工作台配置快捷键,选择Window中的Preferences中的General下的Keys中content属性中可以改变快捷键。
5:高版本编译器编译出来的程序不能给低版本的java运行,低版本的javac编译的程序可以给高版本的java运行。
6:设置快捷键模板:window-preferences-java-Editor-Templates 。
7:静态导入:普通的ioport导入的是某个类或某个包中的所有的类。静态导入可以导入某个类中的静态方法,简化书写。写法 例如: import static java.lang.Math.*; 导入Math这个类中的所有的静态方法
。
8:可变参数:方法的参数列表的个数不确定,只能放在参数列表的最后面。
getSum(String s,int...a) 其中a是个存放参数的数组。可用遍历数组的方式调用该方法。
9:增强for循环,可以遍历集合,数组等等。for(String s:ss){} s是个变量,ss是个实体数组或集合等。所迭代的集合必须实现Iterator接口,不能遍历map集合。
10:基本数据类型的自动装箱与拆箱:将基本数据类型变成一个对象。拆箱是将一个对象向下拆成一个基本数据类型。int类型的数据-128~127之间的数据装箱是会是同一个对象。超出了这个返回的2个
相同的数据装箱成对象时是2个不同的对象。
享元模式:有很多的小的对象,因为经常要用到,没必要每一个都定义成一个不同的对象,可以将它们定义成同一个对象,将相同的属性封装在对象的内部,不同的属性可以对外提供一些方法可以访问
这些参数,称之为外部状态。
11.枚举:让某些指定的类型的实例对象是固定的,不能随便赋值,也不能创建新的对象,只能是规定好的值。
注释一段代码:选中代码按Ctrl+Shift+/
枚举中的成员就是这个枚举类锁对应的一个个实例对象。
调用枚举中的一个静态方法values()可以得到该枚举中的所有的对象的一个集合。
枚举中的成员必须位于枚举类的最前面。枚举类的构造方法必须私有。枚举类一调用,该类中的所有成员都会被初始化调用相对应的构造函数。
12.Class类是描述所有类的一个类。Class类的实例对象都是字节码文件,得到类的字节码有3种方式,第一种:类名.class ,例如String.class ,第二种:通过类中的一个对象.getClass()来得到,
如"abc".getClass(),第三种:Class.forName("类的字符串名称"),如:Class.forName("java.lang.String");任何类型都有相对应的类,包括8中基本数据类型(byte,short,int,long,char,boolean,float,double)
,还有返回值void,void.class是void的字节码文件。8中基本数据类型的字节码跟器所对应的对象的字节码不相同,比如:int.class=Integer.class,但是Integer.TYPE==int.class。int[].class是一个属于数组类
型的类。只要是在源程中出现的任何类型,都有对应的Class实例对象。
13.反射:反射就是将java类中各种成分映射成相应的类。某个类中的成员变量,构造方法,成员函数等都有相对应的类:Field,Constructor,Method,可以通过这个类的字节码对象来获取这些成员的类型
。
反射会导致程序性能下降。
Class类中的方法getField()只能获取某个类中的非私有的成员变量,如果是私有的成员变量,需要通过调用另外一个方法setAccessible(true)来获取,熟称“暴力反射”!(包括构造方法和成员函数)
如下:
Demo d=new Demo(3,5);
Field fieldX=Demo.class.getField("x");
fieldX.setAccessible(true); //如果Demo类中成员变量x私有,则需要调用此方法。
System.out.println(fieldX.get(d));
通过反射获取一个类中的方法:
String s="abcdef";
Method methodCharAt=String.class.getMethod("charAt",int.class); 传入2个参数,第一个是方法名称,第二个是参数的类型。
Object o=methodCharAt.invoke(s,3); 然后用这个方法去调用对象,传入2个参数,第一个是对象,第二个是参数的具体值。 参数列表都是可变参数。
Object o=methodCharAt.invoke(null,3); 如果传入的对象是null,那就说明这个方法是静态方法,不需要对象。
数组的反射:数组是个对象。可以将数组转换为一个List集合。
如果是String类型的数组,可以转换为装有字符串对象的列表,如果传入的是int类型的数组,则会把该数组当作一个对象存入集合中,遍历该集合只能得到一个数组对象。
14:内存泄露:某个对象存在内存中不再被用到了,而一直占用内存空间,没有被释放 。
15:JavaBean:一个在该类中有set跟get方法的java类,可以当作普通的java类来操作,普通的java类不一定能当作javaBean。
javabean中的属性名是根据方法名来判断的,将方法的set跟get去掉后,参照下面例子。
gettime()--->time setTime()--->time getCPU()--->CPU
内省的练习:在一个Person类中有一个成员变量name,还提供get跟set方法来获取或设置该变量的值。
这里要用到一个类:PropertyDescriptor,用来操作javabean类的一个类。如下:
Panxing p=new Panxing("panxing",22);
String propertyName="name";
PropertyDescriptor pd=new PropertyDescriptor(propertyName,p.getClass());
创建一个PropertyDescriptor类,第一个参数:将变量名作为字符串传递进来。
第二个参数:该变量名所对应的字节码文件对象。
Method methodGetName=pd.getReadMethod(); 通过这个类中的方法getReadMethod()方法得到该变量对应的get方法。
Object o=methodGetName.invoke(p); 用该get方法调用要操作的对象得到变量的值。
System.out.println(o);
Method methodSetName=pd.getWriteMethod(); set方法原理同上。
methodSetName.invoke(p,"liufang");
Object obj=methodGetName.invoke(p);
System.out.println(obj);