自动打包 && 自动拆包
sample
ArrayList<Integer> = new ArrayList<Integer>();
list.add(3);
int i = list.get(0);
3会被自动打包成Integer类型,随后被自动拆包为int型。
Tips: 这里处理定长的数组类型,ArrayList的效率要远远低于基础类型数组,因为每次添加元素都要进行打包。打包规范要求char, byte, boolean <=127 或者short, int值介于-128~127之间包装在固定对象中,因此可以实现对象的比较等过程中的自解压。打包拆包是便以其认可的,与虚拟机没关系。
Java实现只修改的方法可以运用org.omg.CORBA中的各种Holder。例如IntHolder等。 e.g. IntHolder X = new IntHolder(); X.value可以获取存储位置的值,修改后所有引用处值变化。
例子:
public static void main(String[] args) { // TODO Auto-generated method stub String num = "1"; int x = 2; System.out.println(num+x); System.out.println(x+Integer.parseInt(num)); }
Result: 12 和 3.
可变参方法,即参数数量不固定的方法。例如 System.out.printf("%d + %d = %d", n, n, n);
printf方法接受的是两个参数,一个是格式字符串,另一个是Object数组;
定义一个可变惨函数:
private int max(int...values){ int tempt = 0; for(int v : values){ if (v > tempt) tempt = v; } return tempt; }
该方法调用的时候可以用茫茫多的参数。
反射:
java.lang.reflect -- Field && Method && Constructor
Modifier 类提供了static 方法和常量,对类和成员访问修饰符进行解码。每一种类型都对应一个常量
//get classClass c1 = Class.forName("test");//get constructorConstructor[] constructors = c1.getDeclaredConstructors();//get con‘s return type:String modifier = Modifier.toString(con.getModifiers());//get constructor con‘s parameters‘ typeClass[] paratypes = con.getParameterTypes();//get MethodMethod[] Methods = c1.getDeclaredMethods();Method[] Methods2 = c1.getMethods();for(Method method : Methods) method.setAccessible(true); /get Method met1‘s return type:
Class returnType = met1.getReturnType();//get fieldsClass c1 = Class.forName(c1.constructor(objects[] org).getClass().getName().toString()); c1 c = Class.forName(c1.constructor().getClass().getName().toString()).newInstance(objects[] org);
捕获异常:
try{ XXXXXXX }catch(Exception e){ YYYYYYYYYY }
枚举类型:
比较两个枚举类型的值可以直接用“==”。
public class Entry { public static void main(String args[]){ System.out.println(Size.SMALL.toString()); System.out.println(Enum.valueOf(Size.class, "SMALL")); System.out.println(Size.SMALL.getAbb()); } enum Size{ SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL"); private Size(String abb){ this.abb = abb; } public String getAbb(){ return abb; } private String abb; } }
结果:
SMALL SMALL S
继承设计:
公共操作和域放在超类里;不要使用受保护的域;仅当is-a的关系时候使用继承;只有在父类方法是子类方法的子集才能使用继承;子类的方法实现不能完全与继承得来的父类方法不同;使用多态来避免过多的由于作用对象不同带来的if和else等;不要过多的使用反射(因为反射机制的使用只有在运行过程中才会出现错误信息)。