java web复习日记 day03(java 技术增强)

xiaoxiao2021-02-28  67

     前言

        在家里复习效率真是低,让大家见笑了,本来准备两天看一天的课程,结果变成了几乎三天,罪过!!想着自己考研失败也应该是注意力不集中,三天打鱼两天晒网所导致的,也不能说三天打鱼两天晒网吧,应该是学习效率太低了,导致自己有点学不进。过几天就去学校了,抓紧时间多学一点东西,不然根本没法去面试,下面我就根据视频讲解顺序来复习一手。

        首先,这一天的主题就是java基础增强,还是没有讲到web开发部分,一共讲了以下几个部分:静态导入,增强for循环,可变参数,枚举类,反射,内省,泛型这几个部分。

    一.静态导入,增强for循环,可变参数

        静态导入,用于导入类的某个静态属性或者方法,使用静态导入可以简化程序对类静态属性和方法的调用。比如说,在一般的输出时,常常使用System.out.printf();此时如果导入import static java.lang.System.out;包时,System.out.printf();可以简化成out.printf();说实话,在快捷键使用的很熟练地时候,使用这种也比较麻烦。而且使用这种方法也必须要知道方法所属的类,有时还可以自己看看类中的方法。

        增强for循环,不用得到所遍历的数组或者集合的长度,直接如:for(变量类型 变量名 :需要迭代的数组或者集合),这种方法也有其弊端,就是不能在遍历的过程中对数组和集合进行操作,如赋值之类的,如果要进行这种操作,还是需要传统的for循环。增强for循环,对取map中的数据也方便了许多,for(Object obj : map.entrySet())就能够实现。

        可变参数,一个方法最多有一个可变参数类型的参数,可变参数在编程时当成数组即可,举例:

public static void main(String[] args) { sum(1,2,3,4,5); } public static void sum(Integer ... args){ //可变参数在编程时当成数组即可 int sum = 0; for(int arg : args){ sum += arg; } System.out.println(sum); }

注意:如果一个方法接受可变参数,那么这个方法也可以接受数组。

    二.枚举和泛型

        我在学习枚举的过程中,感觉到枚举是一个限制输入数据值的技术而泛型是一个限制输入数据类型的技术。

    

(图为传智播客的PPT截图)

         泛型允许程序员在编写集合代码时,就限制集合的处理问题,从而把原来程序运行时可能发生的问题,转变成编译时的问题,从而提高程序的可读性和稳定性。下面是一个使用泛型和增强for循环来遍历Map的例子:

public void test2() { Map<String,Integer> map = new HashMap<String,Integer>(); map.put("aa", 1); map.put("bb", 2); Set<Map.Entry<String, Integer>> set = map.entrySet(); for(Map.Entry<String, Integer> me : set){ System.out.println(me.getKey() + "=" + me.getValue()); } }

        自定义泛型格式:public static <T> void doSomething(T t).

        有时需要在多个地方使用同一种泛型,可以将泛型定义在类上,public class Demo3<T> {},但是只对类的非静态成员有效。

    三.反射

        这个视频课的老师还蛮搞笑的,说:"有的同学老是问我,反射到底有什么用,调用方法,得到属性不是很简单吗!学这个是不是有病。"说实话我也觉得学这个没啥用,后来老师解答了心中的疑惑:反射是学习框架使用的必经之路。

        应用举例:

Class clazz = class.forName(完整类名); //Class clazz = 类名.class; 类名 变量名 = clazz.newInstance(); //得到某个类所有的构造方法,例: Constructor [] constructors= Class.forName("java.lang.String").getConstructors(); //得到某一个构造方法,例: Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class); //利用构造方法创建实例对象: String str = (String)constructor.newInstance(“abc”); //Class类的newInstance()方法也可创建类的实例,其内部工作原理是先得无参的构造方法,再用构造方法创建实例对象。 String obj =(String)Class.forName("java.lang.String").newInstance(); //反射类私有的、有参的构造方法:private Person(int name)     @Test     public void test3(){         Class clazz = Class.forName("cn.itcast.reflect.Person");         Constructor c = clazz.getDeclaredConstructor(int.class);         c.setAccessible(true);//暴力反射         Person p = (Person) c.newInstance(1);         System.out.println(p);     } //反射类中的方法并执行 Method类代表某个类中的一个成员方法 得到类中的某一个方法: 例子: Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);//方法名,参数类型 调用方法: 通常方式:System.out.println(str.charAt(1)); 反射方式: System.out.println(charAt.invoke(str, 1)); //对象,参数

反射技术用于框架使用,老师视频里也讲了讲个小框架,挺方便的。

四.内省

    内省是一种操作javaBean的技术。java.beans包提供的内省api不便使用,举例为:

public void test1() throws Exception{ Student s = new Student(); PropertyDescriptor pd = new PropertyDescriptor("name",Student.class);//取Student内名为name的属性 Method method = pd.getWriteMethod(); //setName() method.invoke(s, "flx"); //System.out.println(s.getName()); method = pd.getReadMethod(); // getName() String result = (String) method.invoke(s, null); System.out.println(result); }

于是使用Apache开发的beanutils开发包进行开发.例:

Student s = new Student(); String name = "flx"; BeanUtils.setProperty(s, "name", name);BeanUtils中的这个方法可以自动转换8种基本数据类型,但是高级一点的数据类型就要自定义转换器进行转化了。举例日期转换器:(这是我这一天唯一有一点不懂的地方,还得努力!) ConvertUtils.register(new Converter(){ public Object convert(Class type, Object value) { //"1980-09-09" if(value==null){ return null; } SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = format.parse((String)value); } catch (ParseException e) { throw new ConversionException(e); } return date; } }, Date.class); 这就是第三天所有内容,出去运动咯。

       

转载请注明原文地址: https://www.6miu.com/read-1950080.html

最新回复(0)