04.eclipse视图管理与程序调试
视图就是一个个的小窗口,透视图就是以某种应用功能的视图的集合,如调试透视图,编程透视图,这样便于切换
调试:双击添加断点,右键选择debug,选择要查看的变量值,右键选择watch就可以看到了
05.配置eclispe的编译与运行环境
设置javac和java 选择首选项,编译器属性compiler,运行环境版本要对应或比编译器版本高即java版本要与javac的对应或比javac的高
06.在eclispe中配置java模板代码
模板代码的应用 右键选择Surround With->try/catch Block 选择配置好的模板
添加java模板代码:首选项Preferences->java->Editor->Templates->New
如name:tryf 。pattern:try{${line_selection}(表示选择的内
容)}finally{${cursor}(光标停靠位置)}
07.在eclipse中导入已有的工程
把工程放到工作台目录下,在eclipse下选择File->Import...
选择General->Existing Project into Workspace
选择工程目录就行了
同时要考虑原来的运行环境,jre system library 就有区别
如果原来的jre和现在jre版本不同
就要选择工程右键选择build path->Configure build path...
把jdk的库删掉,然后添加自己的库
==========第3单元:java5的一些简单新特性===============
08.java5的静态导入与编译器语法设置
import语句可以导入一个类或某包的所有类,只是为了少写前缀
import static导入一个类中的某个静态方法或所以静态方法
如import static java.lang.Math.max;这样就可以直接调用max()而不加Math前缀了
还有就是jdk1.4是没有这个特性的
09.可变参数与OverLoad相关面试题分析
Overload和Override的区别
Overload是重载的意思,Override是覆盖的意思,也就是重写。
可变参数举例:
add(int x,int... args){
int sum = x;
for(int i=0;i<args.length;i++){
sum += args[i];
}
return sum;
}
10.java5的增加for循环
语法:for(type 变量名:集合变量名){}
如:add(int x,int... args){
int sum = x;
for(int arg : args){
sum += arg;
}
return sum;
}
11.基本数据的自动拆装箱及享元设计模式
装箱:自动把一个基本数据类型装成一个对象。如:Integer iObj=2;
拆箱:把对象转换成基本数据类型如:println(iObj+12);因为Integer不支持加法。
享元模式(flyweight):有很多很小对象,他们有很多相同的东西,那你就可以把他们变成一个对象,还有一些不同的东西变成外部的属性作为方法的参数来传入。
举例:
Integer i1 = 13;
Integer i2 = 13;
Integer i3 = 137;
Integer i4 = 137;
System.out.println(i1 == i2);//整数是一个字节就共享一个对象
System.out.println(i3 == i4);
结果:true
false
=================第4单元:java5的枚举==================
12.枚举的作用介绍
就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就报错
13.用普通类模拟枚举的实现原理
采用抽象方法定义nextday()将大量的if.else语句转移成了一个个独立的类
14.java5的枚举的基本应用
public enum WeekDay{
SUN,MON,TUE,WED,THI,FRI,SAT;
}
WeekDay weekDay = WeekDay.FRI;
System.out.println(weekDay);
System.out.println(weekDay.name());
System.out.println(weekDay.ordinal());//排行
System.out.println(WeekDay.valueOf("SUN").toString());//转换为枚举元素
System.out.println(WeekDay.values().length);//把枚举元素放到数组
15.实现带有构造方法的枚举
public enum WeekDay{
SUN(1),MON(),TUE,WED,THI,FRI,SAT;
private WeekDay(){System.out.println
("first");}
private WeekDay(int day)
{System.out.println("second");}
16.实现带有抽象方法的枚举
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time =
time;}
}
=================第5单元:反射的深入讲解===============
17.透彻分析反射的基础_Class类
描述java类的这类事物的类名就叫Class
字节码的实例对象(Class类型):1、类.class 2、对象.getClass() 3、Class.forName("类名")
9个预定义Class实例对象如:
int.class==integer.TYPE
void.class
总之,只要是在源程序中出现的类型都有各自Class实例对象。如int[],void...
18.理解反射的概念
反射技术把java类中的各种成分映射成相应的java类
java类的Class类显然提供一系列方法来获取其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用应用类的实例对象来表示,,它们是Field Mothed Contructor Package等
一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,有什么用,怎么用,这正是学习和应用反射的要点。
我就在想,我们可以从内存中获得了字节码,那我们就应该可以再从字节码当中获取其中包含的方法、变量等,只要我们提供足够的信息
19.构造方法的反射应用
举例:
Constructor constructor1 =
String.class.getConstructor(StringBuffer.class);
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
注意:StringBuffer.class(类型)和new StringBuffer("abc")(
和上面类型相同的实例对象)对应
20.成员变量的反射
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");
//fieldY的值是多少?是5,错!fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值
System.out.println(fieldY.get(pt1));
获取私有的成员变量:
Field fieldX = pt1.getClass().getDeclaredField("x");//看得到却取不到
fieldX.setAccessible(true);//暴力反射
System.out.println(fieldX.get(pt1));
21.成员变量反射的综合案例
将任意一个对象中的所有String类型的成员变量所对应的字符串的
“b”改成“a”:
private static void changeStringValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();
for(Field field : fields){
//if(field.getType().equals(String.class)){
if(field.getType() == String.class){
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace('b', 'a');
field.set(obj, newValue);
22.成员方法的反射
举例:
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str1, 1));
System.out.println(methodCharAt.invoke(str1, new Object[]{2}));
23.对接收数组参数的成员方法进行反射
我为什么用反射的方式调:我写程序的时候并不知道这个类,但是到我运行的时候可以通过传递参数的方式调用这类
举例说明:
String startingClassName = args[0];
Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
//mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}});
mainMethod.invoke(null, (Object)new String[]{"111","222","333"});
24.数组与Object的关系及其反射类型
int [] a1 = new int[]{1,2,3};
int [] a2 = new int[4];
int[][] a3 = new int[2][3];
String [] a4 = new String[]{"a","b","c"};
Object aObj1 = a1;
Object aObj2 = a4;
//Object[] aObj3 = a1;Object[]数组中的元素是Object,int []数组中的元素是int。这两个就不能划等号了
Object[] aObj4 = a3;
Object[] aObj5 = a4;
System.out.println(Arrays.asList(a1));//显示不正常
System.out.println(Arrays.asList(a4)); //调用List Arrays.asList(Object[] a)即Object[] a=a4,所以可以调用
25.数组的反射应用(Array())
举例:
private static void printObject(Object obj) {
Class clazz = obj.getClass();
if(clazz.isArray()){
int len = Array.getLength(obj);
for(int i=0;i<len;i++){
System.out.println
(Array.get(obj, i));
}
}else{
System.out.println(obj);
}
}