Java - 基础增强 - 增强for - 可变参数 - 枚举 - 反射 - 内省 - 泛型
来源:互联网 发布:linux创建文件目录 编辑:程序博客网 时间:2024/05/20 04:27
增强for:注意:只适合取数据
// 使用增强for遍历Map集合@Testpublic void test1() {LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();map.put("张三", 20);map.put("李四", 21);map.put("王五", 22);map.put("赵六", 23);for (Map.Entry<String, Integer> me : map.entrySet()) {System.out.println(me.getKey() + me.getValue());}}// 使用传统for遍历Map集合@Testpublic void test2() {LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();map.put("张三", 20);map.put("李四", 21);map.put("王五", 22);map.put("赵六", 23);Set<String> keySet = map.keySet();for (Iterator<String> it = keySet.iterator(); it.hasNext();) {String key = it.next();int value = map.get(key);System.out.println(key + value);}}
可变参数:注意:可变参数必须位于最后一项。
public class Demo1 {/* * 可变参数:适用于参数个数不确定,java把可变参数当做数组处理。 * * 注意:如果出现可变参数的重载的情况,则编译器会自动调用最合适的方法匹配。 * * 但是: * public class Demo2 { static void f(float i,Character...args){ System.out.println("first"); } static void f(Character...args){ System.out.println("second"); } public static void main(String[] args){ f(1,'a'); f('a','b');//Error无法确定调用哪个方法 }} * */public static void main(String[] args) {int[] i = { 1, 2, 3 };String[] s = { "a", "b", "c" };show(i); // 编译器会自动的把参数转变为数组的 show(new Object[]{i})show(s); // 当使用数组作为参数(类型兼容),那么编译器就不会帮你转化为数组了show(s, i);// show(new Object[]{s,i})}/*********** * jdk5以后 ***********/private static void show(Object... obj) {System.out.println("数组长度:" + obj.length);}/*********** * jdk5以前 ***********/private static void show2(Object[] obj) {System.out.println(obj.length);}}
输出结果:
数组长度:1数组长度:3数组长度:2
枚举(enumeration)类:单例、多例、用于限定范围、是一个特殊类、继承Enum、每一个枚举值代表一个实例对象
public class EnumTest {/* * 编写一个星期几的枚举WeekDay, * 要求:枚举值MON,TUE,WED,THU,FRI,SAT,SUN * 调用方法返回中文格式的星期。 */public static void main(String[] args) {printDay(WeekDay.WED);}private static void printDay(WeekDay day) {System.out.println(day.getEnday() + ":" + day.getCnday());}}enum WeekDay {/* * 枚举是用来限定范围,枚举值就是它的具体取值范围 * 当有多个枚举值的时候,可以通过构造函数的重载,来表示不同的对象。 * 在这里枚举只是用来封装星期信息,每一个枚举值代表一个星期对象。 * 每一个星期对象应该有一个英文的星期成员,和一个把英文星期转换成中文的方法。 */MON("Monday") {public String getCnday() {return "星期一";}},TUE("Tuesday") {public String getCnday() {return "星期二";}},WED("Wednesday") {public String getCnday() {return "星期三";}},THU("Thursday") {public String getCnday() {return "星期四";}},FRI("Friday") {public String getCnday() {return "星期五";}},SAT("Saturday") {public String getCnday() {return "星期六";}},SUN("Sunday") {public String getCnday() {return "星期天";}};private String enday;public String getEnday() {return enday;}WeekDay(String day) {enday = day;}public abstract String getCnday();}
反射:1.加载类字节码Class 2.解剖出类的个个组成部分 3.使用........主要用于框架...
public class Reflex {// 反射无参数的构造函数@Testpublic void test1() throws Exception {Class clazz = Class.forName("cn.itcast.demo.Person");Constructor c = clazz.getConstructor(null);Person p = (Person) c.newInstance(null);}// 反射有参数的构造函数@Testpublic void test2() throws Exception {Class clazz = Class.forName("cn.itcast.demo.Person");Constructor c = clazz.getConstructor(String.class);Person p = (Person) c.newInstance("张三");}// 反射主函数@Testpublic void test3() throws Exception {Class clazz = Class.forName("cn.itcast.demo.Person");Method m = clazz.getMethod("main", String[].class);/* * 主函数的参数是一个字符串数组... * invoke(Object obj, Object... args)方法... * 接收的参数是一个可变参数列表。如果直接传递一个字符串对象数组,编译器不会帮你把数组封装到Object数组中 * 那么invoke()方法内部在遍历这个数组获取参数的时候,遍历到的结果是空 * 所以只能把他提升为Object对象,这样它才会被编译器当成一个元素封装到Object数组中 * */m.invoke(null, (Object) new String[] {});}// 反射私有方法@Testpublic void test4() throws Exception {Class clazz = Class.forName("cn.itcast.demo.Person");Method m = clazz.getDeclaredMethod("getName", null);// 修改访问权限,强制访问、、、m.setAccessible(true);String str = (String) m.invoke(clazz.newInstance(), null);System.out.println(str);}// 反射字段@Testpublic void test5() throws Exception {Class clazz = Class.forName("cn.itcast.demo.Person");Person p = (Person) clazz.newInstance();Field numField = clazz.getDeclaredField("num");// 修改访问权限,强制访问、、、numField.setAccessible(true);int num = numField.getInt(p);System.out.println(num);Field numsField = clazz.getDeclaredField("nums");Integer[] nums = (Integer[]) numsField.get(p);System.out.println(nums);}}
内省:通过反射机制获取 setter和 getter
1.使用SUN的 java.beans:
public class JavaBeanTest {@Testpublic void test1() throws Exception {BeanInfo bi = Introspector.getBeanInfo(cn.itcast.bean.User.class);PropertyDescriptor[] pds = bi.getPropertyDescriptors();for (PropertyDescriptor pd : pds) {System.out.println(pd.getName());}}@Testpublic void test2() throws Exception {Class clazz = Class.forName("cn.itcast.bean.User");User u = (User) clazz.newInstance();PropertyDescriptor pd = new PropertyDescriptor("name", cn.itcast.bean.User.class);Method setMethod = pd.getWriteMethod();setMethod.invoke(u, "张三");Method getMethod = pd.getReadMethod();String name = (String) getMethod.invoke(u, null);System.out.println(name);}}
2.使用beanutils:
public class BeanUtilTest {// 使用 BeanUtils@Testpublic void test1() throws Exception {User u = (User) Class.forName("cn.itcast.bean.User").newInstance();BeanUtils.setProperty(u, "name", "张三");String name = BeanUtils.getProperty(u, "name");System.out.println(name);}// 自定义日期转换器 ConvertUtils@Testpublic void test2() throws Exception {String name = "张三";String birthday = "1949-10-1";ConvertUtils.register(new Converter() {public <T> T convert(Class<T> type, Object value) {if (value == null)return null;if (!(value instanceof String))throw new ConversionException("不能转换");String str = (String) value;if (str.equals(""))return null;SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");try {return (T) df.parse(str);} catch (ParseException e) {throw new RuntimeException(e);}}}, Date.class);User u = new User();BeanUtils.setProperty(u, "name", name);BeanUtils.setProperty(u, "birthday", birthday);System.out.println(BeanUtils.getProperty(u, "birthday"));System.out.println(BeanUtils.getProperty(u, "name"));}}
泛型(generic):注意:如果两边都使用泛型,两边必须都一样、、、类型参数变量、、、实际类型参数、、、
public class GenericTest {/* * 编写一个泛型方法,接收任意数组,并颠倒顺序 */public static void main(String[] args) {Integer[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };changeArr(arr);for (int val : arr) {System.out.println(val);}}public static <T> void changeArr(T[] arr) {int len = arr.length;if (len == 0) return;int centre = len / 2;int end = len - 1;for (int star = 0; star < centre; star++, end--) {T temp = arr[star];arr[star] = arr[end];arr[end] = temp;}}}
0 0
- Java - 基础增强 - 增强for - 可变参数 - 枚举 - 反射 - 内省 - 泛型
- java基础加强(枚举,反射,增强for循环,可变参数,自动拆箱装箱,内省)
- java基础增强--自动装箱拆箱、增强for循环、可变参数、枚举类、内省、beanUtils
- Java基础增强2-枚举,可变参数
- 01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型
- Java基础增强---可变参数
- 黑马程序员:基础加强(可变参数、增强for、枚举、javabBean、BeanUtils、注解、泛型)
- Java基础增强3-反射,内省,beanutils,泛型
- Java基础 Collections Arrays 增强for循环 可变参数
- 黑马程序员_Java高新技术(静态导入、可变参数、增强for循环、自动拆装箱、枚举、反射)
- 黑马程序员--Java基础加强(2)-- JDK1.5新特性之可变参数,增强for,自动拆装箱,枚举
- Java基础加强<二>可变参数、增强for循环、基本类型的自动拆箱与装箱、枚举
- 静态导入 可变参数 增强for循环 自动装箱 枚举
- 黑马程序员--高新技术--可变参数,增强for循环,枚举
- 静态导入,可变参数,枚举与增强型for循环
- [java]jdk1.5的新特性----可变参数、增强for循环、枚举、单例模式
- jdk5.0新特性(泛型、枚举、静态导入、自动拆装箱、增强for、可变参数)
- Java基础&增强 枚举
- java SQL resultSet的实践理解
- SVN报错:can't open file db/txn-current-lock:permission denied 解决方法
- Hdu-5024 Wang Xifeng's Little Plot(记忆化搜索)
- 微博的分享,可以分享任何东西。 各种微博
- 错误 1 error C2065: "endl": 未声明的标识符
- Java - 基础增强 - 增强for - 可变参数 - 枚举 - 反射 - 内省 - 泛型
- 自我反省(一)
- poj-2140
- 你为你的机会准备了什么
- ZOJ Problem Set - 1188 DNA Sorting
- 判断子序列、求最长公共子序列算法实现
- tomcat 卡死 Initializing Spring root WebApplicationContext
- Xcode6编译SDWebImage报错解决方法(SDWebImageDownloaderOperation.m错误)
- HDU 2.1.1最小公倍数