加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java基础增强

发布时间:2020-12-14 06:25:39 所属栏目:Java 来源:网络整理
导读:1. 静态导入和自动装箱拆箱 (1).静态导入: 导入java里面类的静态成员 import static 包名 类名 静态属性/静态方法/*(2).自动装箱拆箱:自动装箱:把基本数据类型赋值给对应的包装类(对象)自动拆箱:把包装类的对象赋值给对应的基本数据类型 Integer i=1;

1. 静态导入和自动装箱拆箱

(1).静态导入: 导入java里面类的静态成员 import static 包名 类名 静态属性/静态方法/*(2).自动装箱拆箱:自动装箱:把基本数据类型赋值给对应的包装类(对象)自动拆箱:把包装类的对象赋值给对应的基本数据类型

Integer i=1; j=i; List l= l.add(1); l.add(2 l.add(3 Iterator k= j1= al=new ArrayList(); }

2. 增强for循环

? ? 用途:遍历数组或者遍历实现Iterable泛型接口的集合

i[]={1,2,3 ( List l= l.add(1 l.add(2 l.add(3 i= Map m= m.put("1","aaa" m.put("2","bbb" m.put("3","ccc" Set s=m.keySet(); Iterator i=s.iterator(); String st= System.out.println(st+ "对应的值为"+ Map m= m.put("1","aaa" m.put("2","bbb" m.put("3","ccc" Set s=m.entrySet(); Iterator i=s.iterator(); Map.Entry me= System.out.println(me.getKey()+"对应的值为"+ Map m= m.put("1","aaa" m.put("2","bbb" m.put("3","ccc" out.println(o+" "+ Map m= m.put("1","aaa" m.put("2","bbb" m.put("3","ccc" Map.Entry me= System.out.println(me.getKey()+" "+ @Test List l= l.add("a" l.add("b" l.add("c" k="d"; ( i=0;i l.add("e" l.add("e" l.add("e" System.out.println(l.get(0 System.out.println(l.get(1 System.out.println(l.get(2 }

3.?可变参数

使用可变参数的精髓:就是看需要什么类型的数据,需要对象就传入对象/对象数组,需要基本数据类型就传基本数据类型/基本数组

[]i={1,3 sum(i); sum(1,3 sum( sum=0 ( sum+= List l=Arrays.asList("1","2","3"); String [] s={"1","3","4"}; l= Integer []i={1,5 l=Arrays.asList(i); }

4. 枚举

4.1?枚举的作用和特性

? 作用:限定某些程序运行时所需要数据的取值范围

? 特性:

? ? ? (1) 枚举类也是一种特殊形式的java类

? ? ? (2) 枚举类中声明的每一个枚举值代表枚举类的一个实例对象

? ? ? (3) 与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须是私有的(因为枚举类的作用就是限定某些程序运行时所需要数据的取值范围,如果构造函数公有,别人就可以随便更改)

? ? ? (4) 枚举类也可以实现接口、继承抽象类

? ? ? (5) jdk5扩展了switch语句,它除了可以接收int,byte,char,short外,还可以接收一个枚举类型

? ? ? (6) 若枚举类只有一个枚举值,则可以单作单态设计模式使用

System.out.println("90" System.out.println("80" System.out.println("70" System.out.println("60" System.out.println("传入参数有错" }

4.2?定义枚举的字段、构造函数、方法去封装更多的信息

A("100-90"),B("89-80"),C("79-70"),D("69-60"); String value; .value= String getValue(){ }

4.3?带抽象方法的枚举?实例化时必须实现抽象方法

A("100-90" "优" B("89-80" "良" C("79-70" "中" D("69-60" "差" }; String value; .value= String getValue(){ }

4.4?普通单例设计模式与枚举单例设计模式

Single sin= .sin= (sin== sin= A; Single s1= Single s2= Single s3= }

?4.6?测试枚举中的常用方法

A("100-90" "优" B("89-80" "良" C("79-70" "中" D("69-60" "差" }; String value; .value = String getValue() { System.out.println(Grade.A.name()); System.out.println(Grade.A.ordinal()); String str = "B" Grade g = Grade.valueOf(Grade.,str); }

4.7?定义一个星期的枚举设置方法返回对应中文星期

"星期一" "星期二" "星期三" "星期四" "星期五" "星期六" "星期天" }

5.?反射

5.1?反射的概念

反射:加载类(获取类的字节码),获取类里面的各种组成成分反射的用途:写框架通过反射获取类里面的各种组成干什么?? ? ? ? ? ? ? ? (1) 获取构造函数去实例化对象? ? ? ? ? ? ? ? (2) 获取字段去封装数据? ? ? ? ? ? ? ? (3) 获取方法去运行

加载类的三种方式:

main(String[] args) Class c1=Class.forName("refelect.Person"); Person p= Class c2=p.getClass(); Class c3=Person.; }

5.2 ?通过反射获取类的构造函数

String name = "aaa" password = 123 age = 23 score = 90 System.out.println("person" System.out.println("person name" Person(String name, System.out.println("person name password" System.out.println("list" System.out.println("aa" aa(String name, System.out.println(name + Class[] aa(String name, Class[] { String. aa( System.out.println("main" }
test1() Class c1=Class.forName("refelect.Person"); Constructor cs1=c1.getConstructor(); Person p1=(Person) cs1.newInstance(); String s= test2() Class c1=Class.forName("refelect.Person"); Constructor cs1=c1.getConstructor(String.); Person p=(Person) cs1.newInstance("aaa"); test3() Class c1=Class.forName("refelect.Person"); Constructor cs1=c1.getConstructor(String.,. Person p=(Person) cs1.newInstance("aaa",123 test4() Class c1=Class.forName("refelect.Person"); Constructor cs1=c1.getDeclaredConstructor(List. cs1.setAccessible(); Person p=(Person) cs1.newInstance( test5() Class c1=Class.forName("refelect.Person"); Person p= }

5.3 通过反射获取类的方法以及main方法的特殊获取

test1() Class c1=Class.forName("refelect.Person"); Method m=c1.getMethod("aa",); m.invoke(c1.newInstance(),); test2() Class c1=Class.forName("refelect.Person"); Method m=c1.getMethod("aa",String.,. m.invoke(c1.newInstance(),"lgs",21 test3() Class c1=Class.forName("refelect.Person"); Method m=c1.getMethod("aa",[]. Class [] cls=(Class[]) m.invoke(c1.newInstance(), []{1,3 System.out.println(cls[0 test4() Class c1=Class.forName("refelect.Person"); Method m=c1.getDeclaredMethod("aa",InputStream.); m.setAccessible(); m.invoke(c1.newInstance(), FileInputStream("c:1.txt" test5() Class c1=Class.forName("refelect.Person"); Method m=c1.getDeclaredMethod("aa",.); m.invoke(c1.newInstance(),23); test6() Class c1=Class.forName("refelect.Person"); Method m=c1.getDeclaredMethod("main",String[].); m.invoke(,(Object) String[]{"1","2"}); }

5.4?通过反射获取类的字段

test1() Class c1=Class.forName("refelect.Person"); Field f=c1.getField("name"); Object o=f.get(c1.newInstance()); Class type= (type.equals(String. String s= Person p= f.set(p,"yc" test2() Class c1=Class.forName("refelect.Person"); Field f= c1.getDeclaredField("password" f.setAccessible(); Object o= test3() Class c1=Class.forName("refelect.Person"); Field f= c1.getDeclaredField("age" f.setAccessible(); Object o= test4() Class c1=Class.forName("refelect.Person"); Field f= c1.getField("score" }

?6. 内省(Introspector)

6.1 为什么要学习内省

开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性

6.2?通过内省操作javabean属性

.name = setPassword( .password = setAge( .age = setScore( .score = }
test1() BeanInfo bi=Introspector.getBeanInfo(Person.,Object.); PropertyDescriptor [] pd=bi.getPropertyDescriptors(); test2() Person p= PropertyDescriptor pd= PropertyDescriptor("age",Person. Method m=pd.getWriteMethod(); m.invoke(p,23); Method mt=pd.getReadMethod(); System.out.println(mt.invoke(p,)); test3() Person p= PropertyDescriptor pd= PropertyDescriptor("age",Person. System.out.println(pd.getPropertyType()); }

6.3?使用BeanUtils类操作javabean属性

使用第三方框架beanutilsbeanutils的配置过程:? ?(1)、新建一个开发库文件夹lib,然后向里面添加commons-beanutils-1.8.0.jar和commons-logging.jar包? ?(2)、同时选中上面的两个jar包-右键-build path-add build path? ?(3)、当上面的两个jar包在Referenced Libraries(会自动生成这个文件夹)里面变为奶瓶时就可以使用beanutils操作javabean的属性了

.name = setPassword( .password = setAge( .age = setScore( .score = .birthday = }
test1() Person p= BeanUtils.setProperty(p,"name","fp"); test2() String name="lgs" String password="123" String age="23" Person p= BeanUtils.setProperty(p,name); BeanUtils.setProperty(p,"password",password); BeanUtils.setProperty(p,"age",age); test3() String name="lgs" String password="123" String age="23" String birthday="1995-06-06" ConvertUtils.register( (value== (!(value ConversionException("只支持String类型的转换" String s= (s.trim().equals("" SimpleDateFormat sdf= SimpleDateFormat("yyyy-MM-dd"); } RuntimeException(e); },Date. Person p= BeanUtils.setProperty(p,name); BeanUtils.setProperty(p,password); BeanUtils.setProperty(p,age); BeanUtils.setProperty(p,"birthday",birthday); test4() String name="lgs" String password="123" String age="23" String birthday="1995-06-06" ConvertUtils.register( DateLocaleConverter(birthday),Date. Person p= BeanUtils.setProperty(p,name); BeanUtils.setProperty(p,password); BeanUtils.setProperty(p,age); BeanUtils.setProperty(p,birthday); test5() Map m= m.put("name","yqh" m.put("password","123456" m.put("age","20" m.put("birthday","1995-12-30" ConvertUtils.register( DateLocaleConverter(),Date. Person bean= BeanUtils.populate(bean,m); }

?7. 泛型

7.1?使用泛型(generic)的好处

? ? 使用泛型的好处可以进行类型安全检查,提高了程序的可读性和稳定性

List l = l.add("aaa" List l1 = ArrayList l1.add("1" System.out.println(l1.get(0 }

7.2?泛型与集合搭配使用及其注意事项

? ? ? ?泛型是给java编译器(javac)使用的;防止在编译阶段向集合插入非法数据,

List l = l.add("aaa" List l1 = ArrayList l1.add("1" System.out.println(l1.get(0 List l1 = ArrayList l1.add("1" l1.add("2" l1.add("3" System.out.println("-------1、传统方案:使用迭代器-----" Iterator it= System.out.println("-------2、增强for循环-----" Map m= HashMap m.put(1,"aa" m.put(2,"bb" m.put(3,"cc" System.out.println("-------传统方式1:keySet-------" Set s= Iterator it= i= System.out.println(i+" "+ System.out.println("-------传统方式2:entrySet-------" Set> se= Iterator> ite= Entry e= System.out.println(e.getKey()+" "+ System.out.println("-------增强for循环-------" (Entry System.out.println(e.getKey()+" "+ ArrayList al= ArrayList al=new ArrayList(); al2=new ArrayList(); ArrayList al3= ArrayList al4= ArrayList List l1 = ArrayList List l2 = }

7.3 自定义泛型

定义泛型方法:泛型遵循先声明再使用的规则

第一种方式:常规方法

aa("aa"); }

第二种方式:一个泛型作用于多个方法时可以把泛型声明在类上

DefineGenericMetgod2 }

7.4 练习

(1)?编写一个泛型方法,交换指定数组元素的位置,记住:一定要使用泛型T定义方法,不能使用诸如String,int子类的类型,那样的话就只能交换一种特定类型的数组

swap(T arr[], pos1, temp = arr[pos1] = arr[pos2] = Integer[] i = Integer[] { 1,5 System.out.println("-----交换之前-----" swap(i,1,3 System.out.println("-----交换之后-----" }

(2)?编写一个泛型方法,接收任意数组,然后颠倒数组里面的元素

? ? ?思路:定义两个指针,第一个指针指向数组的第一个元素,第二个指针指向数组的最后一个元素,把两个元素交换,然后把第一个指针加1,第二个指针减1,再交换,如此进行下去知道两个指针的值相同时不在进行交换

first = 0 last = arr.length - 1 ( (first >= temp = arr[first] = arr[last]= first++ last-- Integer[] i = Integer[] { 1,5 System.out.println("-----颠倒之前-----" System.out.println("-----颠倒之后-----" }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!