引入引用变量的概念
栈内存负责存储对象名称和局部变量的值,而堆内存存储对象值
每一个对象,在声明对象的时候,会在栈对象中分配内存,例如Duck d,那么栈内存则会分配位置给D
,而d里面的参数和值,都是没有的,为啥,因为没有给d分配内存,只是声明了一个对象而已。而new关键字
就是为对象申请了内存,而该对象内存则存储在系统堆内存里面。。。这也是引用变量!
而比较特殊的是基本数据类型,他们的内存都是存储在栈内存里面:举例:说如果对象在栈内存里的存储方式为Duck d,那么局部变量的存储就是Duck d = new Duck();
2.值传递和引用传递
通过判断对象的内存来判断是值传递还是引用传递,从而达到修改数值的目的!
String不是基本数据类型String str = “String”;其实是已经实例化了对象
从上部分可以明白,如果数据是存储在栈内存,则为值传递,如果是堆内存,则为引用传递
3.动态对象代理
还是比较有用的,例如需要处理一件事物的时候,又要插入做其他事情。。。
正如如果需要处理很多事情,通过reflect.Proxy的代理去处理,对数据资源进行统一的处理!
需要调用Reflect的两个接口,一个是:InvocationHandler,另一个是newProxyInstance()
实现客户对数据的动态代理。。。我也不知道是毛东西,连反射都不知道是啥,说个JB,看代码吧。。
public class Proxy implements InvocationHandler {
private Superman target;
public Proxy(Superman target) {
this.target = target;
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.println(“大量的评估工作”);
target.setMoney(5);
method.invoke(target, objects);
System.out.println(target.getMoney()>10?”吃屎去吧”:”代购去吧”);
return null;
}
}
public static void main(String[] args) {
//动态代理
Superman s = new Superman();
Proxy p = new Proxy(s);
Subject s2 = (Subject) java.lang.reflect.Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), p);
s2.shopping();
}}
Superman s = new Superman();
Proxy p = new Proxy(s);
Subject s2 = (Subject) java.lang.reflect.Proxy.newProxyInstance(s.getClass().getClassLoader(), s.getClass().getInterfaces(), p);
s2.shopping();