您好,欢迎访问三七文档
JAVA进阶之旅JAVA进阶之旅(一)for循环在我们的开发中是非常非常的多的,但是有多少人会用增强for循环?其实还是有很多人会用哈,但是还是有很多人一知半解,我们来看一下增强for循环的格式是怎样的语法for(type变量名:集合变量名){….}注意事项1.迭代变量必须在括号内定义2.集合变量可以是数组或实现了iterable接口的集合类我们写一个小例子来查看一下就知道了publicclassForClass{publicstaticvoidmain(String[]args){int[]mInt={1,3,5,7,9};for(intx:mInt){System.out.println(result:+x);}}}输出的结果也是总所周知,全部输出来了,这里就不演示了,这就是比较简单的增强for循环了二.基本数据类型的自动拆箱与装箱这个基本数据类型的拆箱与装箱是什么呢?这样,我们用思路来说明,我们看这段代码Integernum1=3;如果详细分析的话,应该是把一个基本数据类型3装箱成了Integer赋值给了num1,如果你使用过以前的JDK版本,具体是几,好像是1.5还是1.6之前是会报错的,再来看下拆箱,其实可以看一下这段代码System.out.println(num1+3);Integer和3相加,是等于6,在现在的JDK版本早就支持了自动拆箱和装箱,所以我们现在只要了解一下就好了,这里要注意以下int范围是-128–127,如果超过了就GG三.享元设计模式(flyweight)同样的,这里会牵扯到一个设计模式,如果我们需要很多个对象,但是每一个对象的使用方法都是一样的,数据也是一样的,所以我们就没必要创建这么多,就创建一个就好了,可重复利用,这个就是享元设计模式了,是不是很简单四.枚举的概述说道枚举,他是JDK1.5新增加的一个概念,其实现在开发用的相对还是比较少的,但是你如果翻阅12年上下的代码,你可以看到很多的枚举的影子,他到底是什么呢?我们来深入了解了解1.我们为什么要用枚举说道这个,我们先来看个例子,比如要定义星期几或者性别的变量,我们该怎么去定义?假设用1-7分别表示星期一到星期日,但是有人可能会写成等于0去了枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错,枚举可以让编译器在编译时控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现的这一目标2.用普通类如何实现枚举功能我们可以模拟一下试试看,需要做的事情有私有的构造方法每个元素分别用一个公有的静态变量表示可以有若干公有方法或抽象方法我们先用基本的JAVA类来演示一下枚举的作用publicclassWeekDay{privateWeekDay(){};publicfinalstaticWeekDaySUN=newWeekDay();publicfinalstaticWeekDayMON=newWeekDay();publicWeekDaynextDay(){if(this==SUN){returnMON;}else{returnSUN;}}publicStringtoString(){returnthis==SUN?SUN:MON;}}这个是我们用普通的方式来实现枚举的思想,这也是可以的,但是我们JAVA中提供了枚举的应用姿势:五.枚举的应用其实但从枚举来说,使用起来还是比较简单的,我们来看下是什么?publicclassForClass{publicstaticvoidmain(String[]args){WeekDayweekDay=WeekDay.THI;System.out.println(weekDay);System.out.println(weekDay.name());System.out.println(weekDay.ordinal());}publicenumWeekDay{SUN,MON,TUE,WED,THI,FRI,SAT}}这样我们就可以直接使用,并且输出的时候可以直接实现打印值的功能,就像上述我们JAVA类的功能一样六.枚举的构造方法我们更进一步的来演示一下其他使用方法publicenumWeekDay{SUN(1),MON,TUE,WED,THI,FRI,SAT;/***1.需要在函数之后*2.必须私有*/privateWeekDay(){System.out.println(只要用到了这个枚举类,都会执行空构造函数);}privateWeekDay(intindex){System.out.println(函数后面接参数就会调用有残构造);}}这段看起来应该并不困难,主要是了解构造函数的规律和什么时候调用,注意一下就好了七.枚举的抽象方法我们继续来看,看下抽象函数的使用方法,我们现在假设路上的红绿灯,我们应该怎么去写?publicenumColor{RED(5){@OverridepublicColornextColor(){returnGREEN;}},GREEN(10){@OverridepublicColornextColor(){returnBLUE;}},BLUE(15){@OverridepublicColornextColor(){returnRED;}};//返回下一种颜色publicabstractColornextColor();//灯显示时间privateinttime;privateColor(inttime){this.time=time;}}实现起来还是有点涵养的对吧,其实思想很通顺,我们有三个灯,他都有显示下一个灯的功能,所以可以直接抽象,而且他有是都需要显示时间,所以,我们可以写一个有参的构造函数,就ok了对了枚举只有一个成员时,就可以作为一种单利的实现方式JAVA进阶之旅(二)一.认识Class类想要反射,你就必须要了解一个类——Class,我们知道,java程序中的各个java类都属于同一事物,我们通常用Classliability描述对吧,反射这个概念从JDK1.2就出来了,历史算是比较悠久了,这个Class可不是关键字哦,这个是一个类,他代表的是一类事物;我们归根结底就是拿到字节码对象这里我们有三种方式是可以得到对应的实例对象(Class类型)1.类名.class2.对象.getClass3.Class.forName(“类名”);—常用我们写一个小程序来过一遍publicclassCalssTest{publicstaticvoidmain(String[]args)throwsClassNotFoundException{Stringstr1=liu;Classclass1=str1.getClass();Classclass2=String.class;Classclass3=Class.forName(java.lang.String);System.out.println(class1==class2);System.out.println(class1==class3);System.out.println(class2==class3);}}通过打印的结果我们可以知道我们都是输出同一份字节码,所以结果都是true,我们再来看,我们的Class其实还有一个方法System.out.println(class1.isPrimitive());System.out.println(Integer.class==int.class);System.out.println(int.class==Integer.TYPE);打印的结果是true,false,true,那这三又是什么意思呢?这个就留给大家猜想一下,应该很容易就知道了的isPrimitive是否是基础类型或者原始类型那我们的数组是什么类型呢?宗旨,只要是在源程序中出现的类型,都有各自的Class类型,列入int[],Void等二.反射的概念好的。了解了Class类的神奇,我们就可以来看看反射的机制了反射的概念:反射就是把JAVA类中的各种成分映射成相应的JAVA类,例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分,成员变量,方法,构造方法,包等信息,也用一个个的JAVA类来表示,就像汽车是一个类,汽车中的发动机,变速箱也是一个类,表示JAVA的Class类要提供一系列的方法,来获取其中的变量,方法,构造方法,修饰符,包等信息,这些信息是用来相应类的实例对象表示,衙门是Field,Method,Contructor,Package等一个类中的每一个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class来调用各种方法,我们接下来一个个讲三.Constructor代表的是某一个类的构造方法,我们用代码来看publicclassCalssTest{publicstaticvoidmain(String[]args)throwsNoSuchMethodException,InstantiationException,IllegalAccessException,IllegalArgumentException,InvocationTargetException{//得到String的StringBuffer构造方法ConstructorStringconstructor=String.class.getConstructor(StringBuffer.class);Stringstr=constructor.newInstance(newStringBuffer(str));System.out.println(str);}}通过获得的方法用到上面相同类型的实例,再看newInstance,得到我们设置参数的构造方法,我们再来看下成员变量的反射四.Field这里我们就模拟了一个类,作为反射的对象publicclassFieldClass{publicintx;publicinty;publicFieldClass(intx,inty){this.x=x;this.y=y;}}那我们实际的操作就是:publicclassCalssTest{publicstaticvoidmain(String[]args){try{//首先为x,y赋值FieldClassfClass=newFieldClass(10,20);//反射成员变量Fieldfield1=fClass.getClass().getField(x);Fieldfield2=fClass.getClass().getField(y);//指定对象System.out.println(field1.get(fClass));System.out.println(field2.get(fClass));}catch(NoSuchFieldExceptione1){//TODOAuto-generatedcatchblocke1.printStackTrace();}catch(SecurityExceptione1){//TODOAuto-generatedcatchblocke1.printStackTrace();}catch(IllegalArgumentExceptione){//TODOAuto-generatedcatchblocke.printSta();}catch(IllegalAccessExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}这样我们就可以直接反射到成员变量的值了,这里我们来做一个小练习来测试一下我们成员变量的反射的理解练习题假设我们有一个对象中,有许多的String类型成员变量,我们的需求就是把所有对应的字符串内容”b”改成”a”题目有了我们整理下思路,首先要做的就是定义一个对象咯publicclassFieldC
本文标题:JAVA进阶之旅
链接地址:https://www.777doc.com/doc-2881771 .html