学习笔记

一、开发工具
1、eclipse与myeclipse的关系
myeclipse是eclipse的一个插件,扩展eclipse的功能,使其可以开发java ee的程序即web项目
2、常用IDE开发工具:NetBeans,eclipse,Jbuilder等
3、快捷键配置
在window下的preferences(首选项)中选择常规(General)然后是keys然后选内容助理(content Assist)
如果有冲突则解除绑定(Remove Binding),然后重新绑定(在Binding栏按alt键同时加"/")来设置快捷键
4、视图管理与程序调试
视图就是一个个的小窗口,透视图就是以某种应用功能的视图的集合,如调试透视图,编程透视图等。
调试:双击添加断点,然后右键选择debug,选择要查看的变量值,右键选择watch就可以看到变量的值。
5、在eclipse中导入已有的工程
首先把要导入的工程放到当前工作台目录下,在eclipse环境下选择File->Import->General->Existing Project into Workspace然后next选择工程目录
注意要考虑原来的运行环境,如果导入的工程跟当前工作台的jre版本不同要重新添加jre:
即选择工程右键选择build path->Configure build path 把jdk的库删掉,然后添加自己的库
二、java5的新特性
1、静态导入
import static导入一个类中的某个静态方法或所有的静态方法
如import static java.lang.Math.max;这样在程序中就可以直接调用max方法而不用在调用时加要调用方法的类名。
2、可变参数
public void xxx(Object x,Object...args){....}
注意:可变参数只能出现在参数列表的最后;
      ...位于变量类型和变量名之间,前后有无空格都可以。
编译器自动为可变参数隐含创建一个数组,在方法中以数组形式访问它!
3、增强for循环
for((修饰符)type 变量名 : 表达式(集合)) {...}
例如:for(int arg: args){sum +=arg;}
集合需要实现了Iteretor接口!
4、基本数据类型的自动拆箱和装箱(以及享元设计模式)
装箱:自动把一个基本数据类型装成一个对象。如:Integer  iObj=2;
拆箱:把对象转换成基本数据类型如:println(iObj+12);因为Integer不支持加法。
享元模式(flyweight):有很多很小对象,他们有很多相同的东西,那你就可以把他们变成一个对象,还有一些不同的东西变成外部的属性作为方法的参数来传入。
例如:Integer i1 = 13;Integer i2 = 13;System.out.println(i1==i2);//返回结果为true
Integer i3 = 137;Integer i4 = 137;System.out.println(i3==i4);//返回结果为false
即装箱时若是-128~127内的整数,装箱时会产生缓存,下次在用时直接从缓存中取就可以了,在此范围以外使用概率小,不存在享元,所有为两个对象。
5、枚举
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,通常变量的方式在开发阶段无法实现这一目标。
在枚举中添加构造方法
         public enum WeekDay{
                   SUN(2,3),MON,TUE,WTO,TXI,FRI,SAT;//注意要在最后一个元素后加分号
                   private WeekDay(){System.out.println("first");}
                   private WeekDay(int day){System.out.println("second");}
                   private WeekDay(int day,int a){System.out.println("three");}  
         }
枚举中也可以有抽象方法
实现抽象方法:即在枚举元素的后面加{}实现抽象方法(即匿名内部类)。
枚举里只有一个元素时,可以作为一种单例的实现方式。
三、反射
Java程序中的各个java类属于同一类事物,描述这类事物的类名即为Class
1、得到字节码对应的实例对象(class类型)
a.类名.class,例如,System.class
b.对象.getClass(),例如,new Date().getClass()
c.Class.forName("类名"),例如,Class.forName("java.lang.String");
2、九个预定义Class实例对象:包括八个基本类型对象和void
例如:int.class==integer.TYPE    void.class
总之,只要是在源程序中出现的类型都有各自Class对象。如int[],void...
3、构造方法的反射
例如:  Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
        String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
 System.out.println(str2.charAt(2));//返回c
注意:StringBuffer.class和new StringBuffer("abc")类型对应,即实例对象的类型必须相同
4、成员变量的反射
a.例如:public int y=5;
 ReflectPoint pt1 = new ReflectPoint(3,5);
      Field fieldY = pt1.getClass().getField("y");
      System.out.println(fieldY.get(pt1));
注意:fieldY不是对象的属性而是类的属性要用它去获取某个对象上对应属性的值
b.获取私有成员变量:
 例如:private int x = 3;
       Field fieldX = pt1.getClass().getDeclaredField("x");//看得到却取不到
       fieldX.setAccessible(true);//暴力反射
       System.out.println(fieldX.get(pt1));
5.成员方法的反射
6.ArrayList_HashSet的比较及Hashcode分析
a.ArrayList是个有顺序的集合 相当于数组 对象是有顺序的填进集合中,不会进行比较 而HashSet他会进行对象比较 当有HashCode值时会进行对象里的值比较
b.ArrayList可以含有重复的元素;HashSet在存放元素前会先查看是否有相同的,不能存放相同的元素!
c.Hashcode会先算出对象在哪一区域,再在该区域查找对比,这种算法用在hashCode 的集合!
d.当一个对象被存储进HashSet以后,就不能修改这个对象中的那些参与计算的哈希值字段,否则,对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了!
7.框架的概念及用反射技术开发框架的原理
框架调用用户提供的类,用户调用工具类;在写程序时无法知道要被调用的类名,所以,在程序中无法直接new某个类的实例对象了,而是用反射方式来做。
8.用类加载器的方式管理资源和配置文件
不要用相对路径放置配置文件,一定要记住用完整的路径,但不是硬编码,而是运算出来。 让用户去选择放置,然后去获取这个路径。
getRealPath();//项目目录/内部配置文件的加载往往是用类加载器去加载的
9.内省(InstroSpector)
javaBean是一个特殊的java类,类中的方法名称,符合某种约定规则,一般用来传递数据信息
命名规则:
a. 如果第二个字母是小的,则把第一个字母变成小的!
b. 如果第二个字母是大的,则保持原样!
PropertyDscriptor类,描述 Java Bean 通过一对存储器方法导出的一个属性!
BeanUtils:
如使用BeanUtils需要导入logging包!
通过BeanUtils的静态方法getProperty方法可直接获得属性;setProperty()可直接设置属性!
BeanUtils的setProperty()方法可设置级联操作,如可设置Date类型的time属性!
BeanUtils的populate()方法可将map中的东西填充到javabean中!
PropertyUtils的setProperty()方法是以属性本身的类型进行操作;而BeanUtils是以字符串的类型进行操作
四、注解
1.注解相当于一种标记,在程序中加了注解就等于为程序打上了了某种标记。没加,就等于没有某种标记,以后javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,就去干相应的事。标记可以加在包、类、字段、方法,方法的参数以及局部变量上。
例如:@Override表示对方法的重写(覆盖)
在某个方法上加@Deprecated表示这个方法过时了
@Retention表示这个注解在哪个阶段,分三种:
a.@Retention(RetentionPolicy.SOURCE)源文件阶段
b.@Retention(RetentionPolicy.ClASS)表示class文件阶段
c.@Retention(RetentionPolicy.RUNTIME)内存中的字节码阶段
@Retention(RetentionPolicy.RUNTIME)
定义一个注解的生命周期(RetentionPolicy.SOURCE、RetentionPolicy.CLASS默认、RetentionPolicy.RUNTIME)
@Target设置注解可用于的元素!
2.为注解增加属性
获得值时将属性当属性来set,获得值时需用方法来get
如果只有一个value属性需要设置,设置属性值时不需要写"value="
当为数组属性赋值时,如果只有一个值,可不写大括号
注解也可为注解当属性
五、泛型
1.泛型中?通配符:
使用?通配符可以引用其他各种参数化类型,?通配符定义变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法
限定通配符的上边界:
Vector<? extends Number> x=new Vector<Integer>() ;
限定通配符的下边界:
Vector<? super Integer> x = new Vector<Number>() ;
2.注意:
a.使用泛型,可以将一个集合中的元素限定为一个特定的类型,更安全
b.泛型是为javac编译器使用的,让编译器挡住源程序中的非法输入
c.当文件编译以后,会去掉集合的"类型"信息
d.数组不能使用泛型
e.泛型的实际类型不能是基础类型,int不行
f.定义泛型方法:在方法的返回类型前加泛型
六、类加载器
1.类加载器就是把程序中出现的类的class文件加载到内存中并处理得到字节码。
2.java虚拟机中可以有多个类加载器,系统默认三个类加载器,每个类加载负责加载特定位置(BootStrap,ExtClassLoader,AppClassLoader)。
3.最开始的类加载器BootStrap不是java类,所以不需要别的类加载器来加载
4.通过defind()方法可将数据转换成Class文件!
七、动态代理
1.AOP(aspect oriented program)面向方面的编程
2.JVM可以在运行期间动态生成类的字节码,这种动态生成的类旺旺被用作代理类,即动态代理;该类必须实现接口,它只能作用于具有相同接口的目标类的代理!
3.CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为没有实现接口的类生成动态代理类,那么可以使用CGLIB库。
4.代理类的各个方法除了调用目标的相应方法和对外返回目标返回的结果外,还可以在代理方法中的四个位置加上系统功能代码:
a.在调用目标方法之前
b.在调用目标方法之后
c.在调用目标方法前后都有
d.在处理目标方法异常的catch块中
八、交通灯管理系统
项目需求分析
首先要生成按照各个路线行驶的车辆,这时候要考虑车辆的走向,即要考虑所有可能的路线,通过分析可以得出共有十二种可能的路线,
然后是信号灯,先忽略黄灯,只考虑红灯和绿灯,即只考虑车辆的行或者停的问题。
信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆后放行左转车辆。
每辆车通过路口的时间为1秒。
面向对象的分析问题
每条路线上都会出现多辆车,路线上要随机增加新的车,在绿灯期间还要每秒减少一辆车。
设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
每条路线上随机增加新的车辆,增加到一个集合中保存。
每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
注意:在灯变成绿灯时,路上的车辆应该先判断自己是否是第一辆车,如果是,则前行,如果不是,则处于等待状态,直到自己是处于第一辆车的位置时在前行。这也是我在分析这个项目时没有考虑到的一个重要步骤。看到老师的分析,我才恍然大悟,明白自己的分析遗漏问题。
每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿。
设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,并且能返回自己的亮黑状态。
总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。
设计一个LampController类,它定时让当前的绿灯变红。
通过这个项目,首先通过老师的分析,我找到自己分析项目需求和老师分析的不同之处,然后去分析自己遗漏的问题,找到自己在分析问题时的不足,然后把需求分析清楚。
在处理问题时,时刻站在面向对象的前提下去分析,然后逐一的去处理项目中涉及到的各个对象,将其抽象为实体类,然后去实现各自的类中所需的方法。
九、银行业务调度系统
项目需求分析
首先银行在处理客户业务时,将客户分为三类:VIP客户,普通客户和快速客户,所以在取号时号码管理机器要将号码分为对应的三种,所以要随机生成不同类型的客户,然后去各自的窗口办理业务。
从上面的分析可以得出,各个不同类型的客户在取号时,各自的号码是相对独立的,所以号码管理机器应该生成三个管理器对象,分别去管理各自的号码。
然后每个服务窗口中要有自己的服务类型和窗口编号,
创建一个MainClass类用for循环创建出4个普通窗口,再创建出1个快速窗口和1个VIP窗口,为每个窗口设置服务类型和编号。
接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码。
刚开始看到这个项目的时候,自己并没有考虑出什么清晰的思路,听老师讲完之后感觉明白了很多,对整个项目有了整体的了解和透彻的分析,感觉做一个项目其实最重要的是先从这个项目的整体去考虑,分析出其中的需要创建的对象,以及各个对象的属性和要完善的功能,分析清楚了,实现其实还是其次的。
通过对这两个项目的分析我感觉以后还是要提高自己的整体分析能力,不要急着想实现的过程,分析透彻是最重要的。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值