1、Eclipse的使用技巧
eclipse与myeclipse的关系(都属于java开发的工具):
后者是前者的一个插件,后来为了方便使用,myeclipse集合了eclipse,后者是收费的。
可大部分人都是用 eclipse 等常用的免费软件。最好用的因为别人都在用。这就是市场。
eclipse是java的一种IDE开发工具。
我的总结:请注意一些英文简写的含义,对应的每个单词。平时积累!
什么叫一个工程(project):
我的看法是,一个独立的项目就是一个工程,一个工程包含多个源文件,运行环境,需要的资源。
IDE(Integrated Drive Electronics)开发工具都支持使用工程化方式管理一个项目的程序开发过程,一般来说一个相对独立的项目就是一个工程,一个项目中涉及的多个java文件,资源文件等用一个工程进行管理。(在这里可以看看以前工作间中的某个工程的结构),在不使用工程管理的情况下,如果一个项目中包括多个Java源文件,编程人员需要精心维护这些源文件之间、以及源文件与其它文件的目录关系,需要逐一编译这些源文件,需要手工启动运行编译后的结果。如果将一个程序的所有源文件用一个工程来组织,开发工具能对所有源文件集中管理,记住每个源文件的位置和相互关系。 工程中有哪几个源文件、启动类是哪个、启动参数设置等配置信息在工程中都记录。
工作间(workspace):
一个工作间包含多个工程,工作间与工作间之间可以独立配置信息
(编译、运行的版本、快捷键之类的)必须注意:不同的jre对应的效果可能不一样,例如java5新特性你用之前的版本,就会报错!
一个workspace可以包含多个project,一个workspace保留了eclipse的一套环境选项的配置,例如,所使用的javac和java命令,等等,细节请查看window->preferences。如果要为eclispe再配置一套环境选项,可以再创
建一个workspace。Package explorer视图窗口中的filters菜单项,可以显示空的父包(此功能默认是关闭的)。
设置快捷键、工作间。
快捷键使用技巧(经常出现软件之间快捷键冲突):
快捷键的位置:window->preferences->General->keys,设置alt+/键进行内容提示时,要注意解除alt+/键原来的绑定关系,直接输入alt+/就可以找到它的绑定关系,删除绑定关系时也可以使用remove binding这个按钮,课后必须教会大家在eclipse中。
代码模板的设置位置:java->editor->Templates
代码模板(template)的作用
自己可以添加,自定义,例如设置tryf 方便敲出try{}finally{};
多想一想:eclipse工作台中的所有工程继承工作台的配置,其中某个工程也可以覆盖工作台的配置!这是不是java面向对象的思想啊?
设置单个工程的javac和java
选择工程,右键->properties可以设置javac,右键->run asàopen run dialog可以设置java。
例子:
先用新的工作间,然后创建新工程,默认的语言即为5.0。先使用Integer x = 3;调整编译器的语法版本为1.4,看到eclipse窗口报错了。然后将这个工程的语言设置为6.0,马上又看到bad version .class运行错误了,这是因为myeclise自带的java为1.5 。然后再将整个工作间的javac设置为6.0(eclipse自带的是jdk1.5),然后看新建工程的javac,也随之改成了6.0,运行则又报bad version .class错误。将工程的编译语言再单独改为5.0,运行则没了问题。整个工作间的语言设置为6.0后,再将整个工作间的java也设置为自己安装的java6。
Perspective与view(透视图与视图)
1)所谓的不同的透视图:不同的小窗口(view)构成的大窗口(perspective),便于进行特有的操作,通过window的b按钮选择不同的view。
2)在eclipse中怎么调试?先双击最左边设置断点,然后回到代码区点右键出现debug,
出现的debug视图后选择需要调试的数据进行watch。
关于工作间配置javac(编译版本)和java(运行版本),简单来说就是高版本运行同级或低版本编译的源文件。向下兼容。
怎么导入工程
找到需要导入的工程,然后粘贴到所需要的工作台,import导入(看是否需要设置jre),buildpath中设置。
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; }
4、增强for循环
语法:
for ( type 变量名:集合变量名 ) { … }
注意事项:
迭代变量必须在( )中定义!
集合变量可以是数组或实现了Iterable接口的集合类
举例:
public static int add(int x,int ...args) {
int sum = x;
for(int arg:args) {
sum += arg;
}
return sum;
}
我的总结:这些都是java5出现的新特性!要熟记!
5、基本数据类型的自动拆箱与装箱
——> -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());
}
}
7、反射实现框架功能
框架与框架要解决的核心问题
我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。
框架要解决的核心问题
我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类(门窗)呢?
因为在写才程序时无法知道要被调用的类名,所以,在程序中无法直接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 {
//写出来的三个全部是可以的,但是相对又不一样!
//可以的绝对路径InputStream ips = new FileInputStream("src/july78javaEnhance/MyPro.properties");//将这个文件加载进来!
//可以的InputStream ips = 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);
}
}