Java高新技术(一)

来源:互联网 发布:网络安全法 实施细则 编辑:程序博客网 时间:2024/05/17 03:13


1eclipse的使用技巧

2静态导入

3可变参数与for循环增强

4基本数据类型的自动拆箱与装箱

5枚举

6反射


1eclipse使用技巧

1)IDE, Integrated DevelopmentEnvironment。

IDE开发工具都支持使用工程化方式管理一个项目的程序开发过程,一般来说一个相对独立的项目就是一个工程,一个项目中涉及的多个java文件、资源文件等用一个工程进行管理。

在不使用工程管理的情况下,如果一个项目中包括多个java源文件,编程人员需要精心维护这些源文件之间、以及源文件与其他文件的目录关系,需要逐一编译这些源文件,需要手工启动运行编译后的结果。如果将一个程序的所有源文件用一个工程来组织,开发工具能对所有源文件集中管理,记住每个源文件的位置和相互关系。工程中有哪几个源文件、启动类是哪个、启动参数设置等配置信息在工程中都有记录

 

2)workspace和project

一个workspace可以包含多个project,一个workspace保留了eclipse的一套环境选项的配置。配置细节可查看window->preferences。如果要为eclipse再配置一套环境选项,可以再创建一个workspace。

 

3)perspective与view

一个perspective代表了若干个view的集合。例如java perspective和debug perspective,可以注意其中包含的view的区别

 

4)javac与java

(1)设置整个workspace的javac与java

 配置:window->preferences->Java->Compiler->Compiler compliancelevel:

 运行环境:window->preferences->Java->Installed JREs

(2)设置单个工程的javac与java

 选择工程,右键->properties可以设置javac

 右键->run as->open run dialog->可以设置java

注:高版本的java能运行低版本的javac;低版本的java不能运行高版本的javac

 

5)快捷键使用技巧

快捷键的位置:General->keys,设置alt+/键进行内容提示时,要注意解除alt+/键原来的绑定关系,直接输入alt+/就可以找到它的绑定关系,删除绑定关系也可以使用remove binding按钮。

代码模版的设置位置:java->editor->Templates

 

2静态导入

静态导入——>不用在使用其他类的静态成员变量,前缀其类名.这将使代码更简洁, 提高编码效率。

使用import static 引入静态成员。其中importstatic java.lang.Math.*;就是静态导入的语法,它的意思是导入Math类中的所有static方法和属性。 这样我们在使用这些方法和属性时就不必写类名。

需要注意的是默认包无法用静态导入,另外如果导入的类中有重复的方法和属性则需要写出类名,否则编译时无法通过。

可变参数与for循环增强

问题:一个方法接受的参数个数不固定,例如:

 System.out.println(add(2,3,5));

 System.out.println(add(1,2,3,5));

可变参数的特点:

1)只能出现在参数列表的最后

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

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

3可变参数与for循环增强

 

增强的for循环

1)语法:

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

2)注意事项:

 迭代变量必须在()中定义

 集合变量可以是数组或实现了Iterable接口的集合类

3)例子:

public static int add(int x, int... args){

 int sum = x;

 for(int arg:args){

  sum += arg;

 }

 return sum;

}

4基本数据类型的自动拆箱与装箱

 

基本数据类型的自动拆箱和装箱——>无需在基本类型(例如double)和包装类型(例如Double)之间人工地进行转换。 方便了基本类型数据和它们包装类地使用

Integer iObj = 3; //将一个基本数据类型自动装箱

System.out.println (iObj + 12); //自动拆箱

Flyweight享元模式: 有很多小的对象,它们有很多相同的属性,把这些相同的属性变为同一个对象,称为内部状态。把那些不同的属性变为方法的参数,称为外部状态。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件; 常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

5枚举

 

1)为什么要有枚举?
-- 枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错。枚举可以在编译器编译时就可以控制原程序中填写的非法制,普通变量的方式在开发这一阶段无法实现这一目标。
2)用普通类如何实现枚举功能,定义一个weekday的类来模拟枚举功能。
-- (1)私有构造方法
(2)每个元素分别用一个共有的静态成员变量表示。
(3)可以有若干共有方法或抽象方法,例如要提供nextDay方法必须是抽象的。
3)枚举的基本应用:
举例:定义一个Weekay的枚举
扩展:枚举类的values,valueOf,name,toString,ordinal等发方法。

总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用WeekDay.SUN.getClas().getName和WeekDay.class.getName().

先学习一下Enum的简单应用,以下简洁的代码已经包括Enum所提供的绝大部分功能。


1.Enum
的应用,包括定义,遍历,switch,Enumset,Enummap等

import java.util.EnumMap;
import java.util.EnumSet;

/**

* Java
枚举类型Enum使用详解

* MyEnum可以存放多个枚举类型


*
枚举类型也可以直接以类的形式声明,可以跟类、接口同级别

* public enum State{ON,OFF }
单独可以作为一个java文件

* @author heqingfei

*
*/

public class MyEnum {

//
定义一个enum枚举类型,包括实例ON,OFF

public enum State{

ON,OFF

}

public enum country{

China,Japan
}

//测试方法


public static void main(String[] args) {

//
直接变量enum

for(State s:State.values()){

System.out.println(s.name());

}

//switch与enum的结合使用


State switchState=State.OFF;

switch(switchState){

case OFF:

System.out.println("OFF");
break;

case ON:

System.out.println("ON");

break;

}

//EnumSet
的使用

EnumSet stateSet = EnumSet.allOf(State.class);

for (State s : stateSet) {


System.out.println(s);

}
//EnumMap
的使用

EnumMap stateMap = new EnumMap(

State.class);

stateMap.put(State.ON, "is On");

stateMap.put(State.OFF, "is off");

for (State s : State.values()) {

System.out.println(s.name() + ":" + stateMap.get(s));
}
System.out.println("===================");
//枚举可以这样被调用


State state1=MyEnum.State.OFF;

System.out.println(state1.name());
System.out.println("===================");
State[] state2=MyEnum.State.values();
for(State state:state2){
System.out.println(state.name());
}

}

}

重点:
1.可以创建一个enum类,把它看做一个普通的类。除了它不能继承其他类了。(java是单继承,它已经继承了Enum),
可以添加其他方法,覆盖它本身的方法

2.switch()参数可以使用enum
3.values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum是,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例

4.无法从enum继承子类,如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。
5.使用EnumSet代替标志。enum要求其成员都是唯一的,但是enum中不能删除添加元素。
6.EnumMap的key是enum,value是任何其他Object对象。
7.enum允许程序员为eunm实例编写方法。所以可以为每个enum实例赋予各自不同的行为。
8.使用enum的职责链(Chain ofResponsibility) .这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处理该请求。
9.使用enum的状态机
10.使用enum多路分发
总结:
枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。枚举元素必须位于枚举体中最开始部分,枚举元素列表的后面要有分号与其他元素分割。把枚举中的成员方法或变量放在枚举元素的前面,编译器报告错误。
带构造方法的的枚举:
构造方法必须定义成私有的,如果有多个构造方法,该如何选择哪个构造方法?枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
带方法的枚举:
定义枚举TrafficLamp,实现普通的next方法,实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式定义。增加上表示时间的构造方法。
枚举只有一个成员时,就可以作为一种单立的实现方式。

6反射

 

反射———>反射:反射就是把java类中的各种成分映射成相应的java类。

①  反射的基石—>Class类:

如: 人———>Person——>张三、李四(实例对象)

Java类—>Class———>各个类在内存中的字节码(实例对象)

②  字节码:一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码。

不同的类的字节码不同

③ 获得一个类的字节码有三种方法:

a 对象.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[]使用;


 


原创粉丝点击