明留

将何所持,将何所往?此刻惜之!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

java学习之五是学习Java基础的终结版,以后就是纯粹的Java相关类的项目开发,并且开发的项目都会同时更新到博客上。

注解就是给这个做上某个标记,然后编译器通过反射在相应的进行处理。也可理解为注解相当于一个源程序中要用的一个类,要在源程序中应用某个注解,得先准备好了这个注解类。
overload 与 override

override(重写)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同。  
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。

ide --->itegrity development environment(集成开发环境)
jms (Java消息服务)
jndi (Java Naming and Directory Interface,Java命名和目录接口)

是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得

可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。

jmx(Java管理扩展)
instanceof:测试左边对象是否是右边类的实例
详细分析java中的几个修饰变量的关键字:
在函数内:
   自动(auto)  临时   局部
   记录register  临时   局部
   静态static    长期   局部
在函数外:
   外部 extern   长期   全文件
   静态 static   长期   一个文件
valatile(用来修饰被不同线程访问和修改的变量。类似于localThread,及可以用在线程安全的时候考虑这个修饰词,比如

在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用)

typedef关键字是一个高级的数据特性,它赋予用户创建自己的类型名称的能力。
    如:typedef int real;=>real相当于int.其很多时候用于复杂场合。
1、断言语法有两种格式:
   .assert<boolean_expression>;
   .assert<boolean_expression>:<detail_expression>;
如果boolean_expression的值为false,则引发AssertionException,第二个参数被转换成字符串并用做AssertionError消息中的描述文本。
2、断言可以更好的控制程序的潜藏问题。
3、在运行过程中,断言并非在执行。(java -enableassertions/-ea 类名;


方法体中的局部内部类不允许有任何修饰符,外部类可以调用匿名内部类的成员方法和属性。静态内部类(失去了直接使用外部类的属性)被上升为顶层类,如果要访问,必须声明外部类的实例。
4、要想达到增强叠式,则让该类实现Iterator。hashMap是线程非安全的,即是异步的;hashTable是线程安全的,即同步的;hashMap允许将null作为key,但这样的key只能有一个。hashTable不允许null作为key。
5、不能用基本类型实例化类型参数。
6、运行时的类型查询只适用于原始类型。泛型上限、下限那样的不支持(但反射可以,没有限制)
7、不能捕获泛型类实例,不过可以用泛型声明的方式抛出类型。
8、不能实例化类型变量;参数化类型的数组是不合法的。
9、注意擦后的冲突;泛型类的类型参数对静态无效。
10、类型通配符与类型参数一样可以使用extends修饰,类型参数可以有多个限定,而通配符只能有一个。
    ? super Number(下限)/ ? extends Number(上限)


jdk5 新特性: 静态导入
              foreach循环(数组或是集合(必须实现了Iterator接口)
              方法的可变参数(只能出现在参数列表的最后...位于变量类型和变量名之间,前后有无空格都可以;调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数
              自动装箱和拆箱

享元模式 flyweight:

   枚举:枚举中可以定义变量和方法(private 的抽象或是不是抽象的), 里面可以定义内部
   有三种方式实现委托 Class.forName(),类名.class, 对象.getClass();
   反射中要记住编译时、运行时的类型问题。
   filed不是对象本身的变量,而是Class(字节码)类上,要用它的get(类对象)获得
   getMethod()要传入本类的方法名和参数,然后调用Invoke()传入对象参数和参数值。注:第一个参数为null,则说明此方法是静态。
   Constructor、Field、Method、Package、Class、ClassLoad、包装类、Set、Map、List、Comparable、Searlizeable、Numbers、Object、Collection、Thread、LocalThread、properties、propertyDescriptor、Apache->BeanUtils、Date、SimpleDate、PropertyUtils、Annotation、Enumeration、Type、ElemType、RetentionPolicy、IO、HashXXX、Entry、Map.Entry、ImageIO、Properties、StringBuffer、StringBuilder、NIO、InvocationHandler、Timer、TimerTask、Discriptor、Socket、ServiceSocket、DatagramSocket、DataPacket、Security、Manager、RandAccessFile、
  IntroSpector(内省)---》javabean--->特殊的java类(要含有get和set方法) 去掉set、get前缀,剩余部分就是javabean属性,剩余部分的第二个字母是小写的,则把剩余的首字母改成小写
refactor(重构)--extract(抽取)method
String propertyName="x";
//"x"-->"X"-->"getX"-->methodGetX();
PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());

//PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性
Method methodGetX = pd.getReadMethod();//获得应该用于读取属性值的方法
Object retVal = methodGetX.invoke(pt1);
System.out.println(retVal);

int vlaue=7;
Method methodSetX = pd.getWriteMethod();// 获得应该用于写入属性值的方法。
methodGetX.invoke(pt1, value);
//第二种方法:改用IntroSpector类  BeanInfo
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass));
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Object retVal = null;
for(PropertyDescriptor  pd: pds) {
 if(pd.getName().equals(propertyName))
 {
  Method methodGetX = pd.getReadMethod();
  retVal = methodGetX.invoke(pt1);
  break;
 }
}
return retVal;
}

泛型:是提供只针对javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉类型信息(即取和拿都可以让编译器知道元素的类型)。
      原始类型可以引用参数化类型,参数化类型可以引用原始类型。List s  = new List<Integer>(); List<String> s1= s;
注意:以上两个都可以,只不过其会让编译器报警告,这里注意编译期[就是在ide中编写代码时]的语法检查。(生成字节码的时候,泛型会被查除掉)
通配符?:使用?可以引用其它各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
通配符的扩展:上边界extends(Number)不能超过上边的界限 、下边界super(Integer);同时包括自己。可以使用&限制多个边界
Vector<? extends Number> x = new Vector<Integer>();
Vector<? super Integer> y = new Vector<Number>();
对在JSP页面中也经常要对set或Map集合中进行迭代
   <c:forEach items="${map}" var="entry">
 ${entry.key}:{entry.value}
   </c:forEach>
注意:泛型参数只能是引用类型,不能是基本类型(8种)。
1、数组类型不能被泛型参数化
2、普通方法、构造方法和静态方法中都可以使用泛型
3、泛型也可以用于异常,称为参数化异常,可以用于方法的throws中,但是不能用于catch中。同时泛型中可以同时有多个类型参数。之间
用逗号隔开。
总结:根据调用泛型方法实际传递的参数类型或返回值的类型来推断,具体规则如下;
  1、当某个类型变量只在整个参数列表中的所有参数和返回值中的多处被应用了,那么根据调用方法时该处的实际应用类型来确定。即直接根据调用方法时传递的参数类型返回值来决定泛型参数的类型;
   swap(new String[], 3, 4)->static <E> void swap(E[]a ,int i,int j)
   2、当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处的实际应用类型对应到了不同的类型,且没有使用返回值,这时候取多个参数中的最大交集类型。
  fill(new Integer[], 3.5f)->static <T> void fill(T[] a,T v)
   3、当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法是该多处的实际应用类型对应到了不同的类型,并且使用返回值,这时候优先考虑返回值的类型
   4、参数类型的类型推断具有传递性
  copy(new Vector<string>(), new Integer[])->static <T> void(Collection<T> a, T[] b)会报错
   5、类级别的泛型和方法级别的泛型(注意区分之间的区域)
   6、Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class);
//获得泛型的所有类型参数
Type[] types = applyMethod.getGenericParamTypes();
ParamterizedType pType = (ParamterizedType)types[0];
System.out.println(pType.getRawType());
System.out.println(pType.getActuallTypeArguments()[0]);
--------------------------------------------------------
public static viod applyVector(Vector<Date> v1) {
}

加载器:ClassLoader(模板方法设计模式)自定义加载器只需重写findclass();

 .class文件加载到内存中(方法区),动态创建一个java.lang.class,该Class封装了源码的数据结构(堆区)
(1).本地系统中直接加载
(2).网络中下载class文件
(3).从打包文件中加载
(4).从专有数据库中加载
(5).java文件动态编译为class文件

 

posted on 2012-06-24 16:34  明留  阅读(864)  评论(0编辑  收藏  举报