Eclipse的使用技巧
eclipse与myeclipse的关系(都属于java开发的工具):
后者是前者的一个插件,后来为了方便使用,myeclipse集合了eclipse,后者是收费的。
可大部分人都是用eclipse 等常用的免费软件。最好用的因为别人都在用。这就是市场。
eclipse是java的一种IDE开发工具。
工程
我的看法是,一个独立的项目就是一个工程,一个工程包含多个源文件,运行环境,需要的资源。
工作间(workspace):
一个工作间包含多个工程,工作间与工作间之间可以独立配置信息
(编译、运行的版本、快捷键之类的)必须注意:不同的jre对应的效果可能不一样,例如java5新特性你用之前的版本,就会报错!
快捷键使用技巧(经常出现软件之间快捷键冲突):
快捷键的位置:window->preferences->General->keys,设置alt+/键进行内容提示时,要注意解除alt+/键原来的绑定关系,直接输入alt+/就可以找到它的绑定关系,删除绑定关系时也可以使用removebinding这个按钮,课后必须教会大家在eclipse中。
2、静态导入(1.5特性,好处是不用写类名)
import语句可以导入一个类或某个包中的所有类
import static语句导入一个类中的某个静态方法或所有静态方法
语法举例:
import static java.lang.Math.sin;
import static java.lang.Math.*;
例子:
原来的:
package reviewDemo76;
public class Demo12 {
public static void main(String[] args) {
System.out.println(Math.max(12,15));
}
}
使用静态导入的:
package reviewDemo76;
import static java.lang.Math.*;
public class Demo12 {
public static void main(String[] args) {
System.out.println(max(12, 15));
}
}
3、可变参数
是为了解决一个简单的方法在参数不同时多个重载的问题,用带可变参数的一个函数就能解决。
可变参数的特点:
1)只能出现在参数列表的最后;
2) ... 位于变量类型和变量名之间,前后有无空格都可以;
3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组 的形式访问可变参数。
Public int add(int x, int... args){//也可以直接(int..args)就是说传不传都可以
Int sum = x;
For(int i = 0; i<=args.lengrth;i++){
Sum+=args[i];
}
return sum;
}
基本数据类型的自动拆箱与装箱
——> -128~127之间的特殊性。为什么要这样设计,好处?
——> 享元模式(Flyweight Pattern):享元模式的特点是,复用我们内存中已存在的对象,降低系统创建对象实例。
自动装箱:
Integer num1 = 12;
自动拆箱:
System.out.println(num1 + 12);
基本数据类型的对象缓存:
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2);
Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4);//false
Integer num5 = Integer.valueOf(12);
Integer num6 = Integer.valueOf(12);
System.out.println(num5 == num6);//false
我的总结:对于享元模式,将最常用的封装以便于我们可以复用!
6、枚举
为什么要有枚举?
问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
1、私有的构造方法。
2、每个元素分别用一个公有的静态成员变量表示。
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类
Eg:package july78javaEnhance;
//很好的一道题目。
enum TrafficLamp{
/**
* 对于这道题目而言,使用的其实是匿名对象内部类!
* 枚举最简单的创建对象方法:RED,YELLOW,GREEN
* 对于普通的类而言,创建对象:Person p = new Person();
*
*/
RED(30){
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(40){
@Override
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN(45){
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){
this.time = time;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}
public class EnumDemo4 {
public static void main(String[] args) {
System.out.println(TrafficLamp.RED.nextLamp());
System.out.println(TrafficLamp.RED.nextLamp().getTime());
}
}
、反射实现框架功能
框架与框架要解决的核心问题
我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。
框架要解决的核心问题
我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类(门窗)呢?
因为在写才程序时无法知道要被调用的类名,所以,在程序中无法直接new 某个类的实例对象了,而要用反射方式来做。
综合案例
先直接用new语句创建ArrayList和HashSet的实例对象,演示用eclipse自动生成 ReflectPoint类的equals和hashcode方法,比较两个集合的运行结果差异。
然后改为采用配置文件加反射的方式创建ArrayList和HashSet的实例对象,比较观察运行结果差异。
引入了elipse对资源文件的管理方式的讲解。
Eg:
package july78javaEnhance;
//利用资源文件加上反射操作!
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
public class ReflectPropertiesDemo8 {
public static void main(String[] args) throws Exception {
//写出来的三个全部是可以的,但是相对又不一样!
//可以的绝对路径InputStreamips = new FileInputStream("src/july78javaEnhance/MyPro.properties");//将这个文件加载进来!
//可以的InputStreamips =ReflectPropertiesDemo8.class.getResourceAsStream("MyPro.properties");
InputStream ips =ReflectPropertiesDemo8.class.getClassLoader().getResourceAsStream("july78javaEnhance/MyPro.properties");
Properties pro = new Properties();
pro.load(ips);
ips.close();
String className =pro.getProperty("className");
Collection col =(Collection) Class.forName(className).newInstance();
//Collection col =new TreeSet();//这样的做法也可以但是现在不想通过在等号右边具体的新建名称来做!
col.add(12);
col.add(13);
col.add(12);
col.add(23);
col.add(36);
System.out.println(col);
}
}