黑马程序员--Java高新技术(1)
来源:互联网 发布:小米设置首选网络类型 编辑:程序博客网 时间:2024/05/16 08:05
------- android培训、java培训、期待与您交流! ----------
1.设置可变参数的函数:
public static int add(int x,int...args){int sum = 0;for(int arg : args){//增强的for循环sum += arg;}return sum;}
2.基本数据类型的自动装箱和拆箱,
基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。
一般我们要创建一个类的对象的时候,我们会这样:Class a = new Class(parameter);
当我们创建一个Integer对象时,却可以这样:Integer i = 100; (注意:不是 int i = 100; )
实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = new Integer(100); 此即基本数据类型的自动装箱功能。
自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用
这里面其实使用了一个设计模式:享元模式,具体请参看这篇文章:
3.枚举
特点:构造函数私有化,所以如果有一个枚举,可以作为特殊的单例
public enum TranfficLamp{RED (30){@Overridepublic TranfficLamp nextLamp() {return GREEN;}},GREEN(45) {@Overridepublic TranfficLamp nextLamp() {// TODO Auto-generated method stubreturn YELLOW;}},YELLOW(5) {@Overridepublic TranfficLamp nextLamp() {// TODO Auto-generated method stubreturn RED;}};public abstract TranfficLamp nextLamp();private int time;private TranfficLamp(int time){this.time = time;}}使用方式:
TranfficLamp t1 = TranfficLamp.RED;TranfficLamp t2 = t1.nextLamp();
4.Java反射机制:
反射就是把Java类中的各个成分映射成相应的Java类;
Class(字节码对象)的3中获取方式:
Objexct.getClass();
类名.Class;
Class.forName();
public boolean isPrimitive()判定指定的 Class
对象是否表示一个基本类型。
public boolean isArray()判定此 Class
对象是否表示一个数组类。
4.1构造函数的反射
Class cl = Person.class;Constructor cst = cl.getConstructor(String.class,String.class,int.class);Person p = (Person) cst.newInstance("张三","boy",15);//产生新对象System.out.println(p.toString());关于Person类,定义如下:
public class Person {private String name;private String sex;private int age;public Person(String name, String sex,int age) {super();this.name = name;this.age = age;this.sex = sex;}public void setPerson(String name, String sex,int age) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setages(int[] ages){this.age = ages[0];}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";}}
4.2 成员变量的反射
Person person = new Person("张三","sdf",15);Field field_age = Person.class.getDeclaredField("age");field_age.setAccessible(true);//暴力反射System.out.println(field_age.get(person));
getDeclaredField
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException
- 返回一个
Field
对象,该对象反映此Class
对象所表示的类或接口的指定已声明字段。name
参数是一个String
,它指定所需字段的简称。注意,此方法不反映数组类的length
字段。
4.3 成员方法的反射
Person person = new Person("bask", "boy",15);Method methodSetName = Person.class.getMethod("setName",String.class);methodSetName.invoke(person, "hello");System.out.println(person.toString());如果是静态方法,Method.invoke(null,参数);
如果该函数不带参数呢?
Method methodGetName = Person.class.getMethod("getName", null);System.out.println(methodGetName.invoke(person, null));
如果函数是多个参数
Class[] cls= new Class[]{String.class,String.class,int.class};Method methodSet = Person.class.getMethod("setPerson", cls);Object[] objs = new Object[]{new String("daoqin"),new String("bigboy"),23};methodSet.invoke(person, objs);System.out.println(person.toString());如果传递的参数是一个数组
Method setagesMethod = Person.class.getMethod("setages", int[].class); setagesMethod.invoke(person, (Object)new int[]{128,18,15,16,17});System.out.println(person.toString());注意:
invoke
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
- 对带有指定参数的指定对象调用由此
Method
对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。如果底层方法是静态的,那么可以忽略指定的
obj
参数。该参数可以为 null。如果底层方法所需的形参数为 0,则所提供的
args
数组长度可以为 0 或 null。
setagesMethod.invoke(person, (Object)new int[]{128,18,15,16,17});
4.4数组对象的反射
private static void printObject(Object object) {// TODO Auto-generated method stubClass cl = object.getClass();if(cl.isArray()){int len = Array.getLength(object);for (int i = 0; i < len; i++) {System.out.println(Array.get(object, i));}}else {System.out.println(object);}}调用方式:
int[] a1 = new int[]{1,2,3};String[] a2 = new String[]{"abc","bcd"};printObject(a1);printObject(a2);
最后看下面这个代码:
int[] a1 = new int[4];int [][] a2 = new int[2][3];Object object = a1;//正确 int[] 是一个Object对象Object[] objects = a2;//正确 理由同上Object[] objects2 = a1;//错误,int不是Objext对象
0 0
- 黑马程序员 (7)JAVA高新技术 1
- 黑马程序员—java高新技术(1)
- 黑马程序员--Java高新技术(1)
- 黑马程序员 - Java 高新技术1
- 黑马程序员---Java高新技术1
- 黑马程序员 Java高新技术1
- 黑马程序员--java高新技术
- 黑马程序员-java高新技术
- 黑马程序员----Java高新技术
- 黑马程序员--Java高新技术
- 黑马程序员--java高新技术--
- 黑马程序员--JAVA高新技术
- 黑马程序员:Java高新技术
- 黑马程序员-----java高新技术
- 黑马程序员-Java高新技术
- 黑马程序员-学习日记21(java高新技术 1 )
- 黑马程序员——java高新技术学习日记(1)
- 黑马程序员——Java高新技术(1)
- oracle 多表联合查询总结归纳
- Opensuse: Use smb connetting the printer shared on Win7
- 该发动机的法国计划的发挥更好发挥
- HDU 1254 推箱子
- 个发帖的人恢复计划将覆盖后的观点
- 黑马程序员--Java高新技术(1)
- HashMap和Hashtable的区别
- 常用Highcharts中文API和Highcharts中文教程
- Java--猜数字
- 任何人体风格和家人发过天津房价该放就放
- Myeclipse8更换J2EE为1.6以上
- shell编程
- c# 深拷贝各种实现
- const与#define的区别