java笔记

来源:互联网 发布:希路猎人鞋好不好知乎 编辑:程序博客网 时间:2024/06/06 20:18

1. 可变参数

public static void main(String[] args) {
System.out.println(addParms(1,2));
System.out.println(addParms(1,2,3,4));
}

public static int addParms(int ... args){
int sum = 0;
for(int i=0;i<args.length;i++){
sum+=args[i];
}
return sum;
}

2. 自动拆箱和装箱

Integer享元模式:数据在-128 到 +128的时候,1个byte之内,包装成一个integer对象的时候,会缓存到池。缓存池有直接取,实质上是一个对象。
public static void main(String[] args) {
Integer obj = 3;
System.out.println(obj+1);
Integer i = 13;
Integer j = 13;
StringBuffer s1 = new StringBuffer("abc");
StringBuffer s2 = new StringBuffer("abc");
Integer i2 = 128;
Integer j2 = 128;
System.out.println(i==j);
System.out.println(s1==s2);
System.out.println(i2==j2);
Integer i3 = Integer.valueOf(3);
Integer i4 = Integer.valueOf(3);
System.out.println( i3 == i4 );
}

3. 反射

反射把java类中的各种属性映射成相应的的java类JAVA反射机制对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
测试1
public static void main(String[] args) throws Exception {
String str1 = "abc";
//字节码对象
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
System.out.println(cls1 == cls2);
System.out.println(cls1 == cls3);
}
结果
true
true
无论几种方式都是一样的字节码

a)成员变量的反射(Constructor)

//反射方法
public static void main(String[] args) throws Exception {
//创建实例对象
//反射方法
java.lang.reflect.Constructor<String> constructor1 = String.class.getConstructor(StringBuffer.class);
String str2 = (String)constructor1.newInstance(/*"abc"*/new StringBuffer("abc"));
System.out.println(str2.charAt(2));
}  

b)成员变量的反射

public class ReflectPoint {
private Date birthday = new Date();
private int x;
public int y;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
测试
public static void main(String[] args) throws Exception {

ReflectPoint pt1 = new ReflectPoint(3,5);
//得到字节码中成员变量y
Field fieldY = pt1.getClass().getField("y");
//fieldY的值是多少?是5,错!fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值
System.out.println(fieldY.get(pt1));
Field fieldX = pt1.getClass().getDeclaredField("x");
fieldX.setAccessible(true);
System.out.println(fieldX.get(pt1));
}
fieldX.setAccessible(true);//暴力反射
结果:5 3。

c)成员方法的反射

public static void main(String[] args) throws Exception {
String str1 = "abc";
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str1, 1));
System.out.println(methodCharAt.invoke(str1, new Object[]{2}));
}
结果:b c。
1 0
原创粉丝点击