值传递和引用传递
Java 有 8 种基本数据类型,分别是 int、long、byte、short、float、double 、char 和 boolean
- Java 中的参数传递是按值传递的。
- 如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
- 如果参数是引用类型,传递的是引用的对象在堆中地址的拷贝。
1 | class ReferenceTypeDemo { |
在 Java 中,String
是不可变的(immutable)。当你把 name
变量传递给 modify
方法时,实际上是将 name
的值(即字符串 "二哥"
)的引用复制给了 modify
方法中的参数 name1
。因此,name1
和 name
都指向 "二哥"
这个字符串。
在 modify
方法中,name1 = "三妹";
只是将 name1
变量指向了一个新的字符串 "三妹"
,并没有改变原来的 name
变量的内容。name
仍然指向 "二哥"
,因此在 main
方法中输出 name
时,仍然会输出 "二哥"
。
Java反射
- 开发通用框架:像 Spring,为了保持通用性,通过配置文件来加载不同的对象,调用不同的方法。
- 动态代理:在面向切面编程中,需要拦截特定的方法,就会选择动态代理的方式,而动态代理的底层技术就是反射。
- 注解:注解本身只是起到一个标记符的作用,它需要利用发射机制,根据标记符去执行特定的行为。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class ReflectionDemo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Writer writer = new Writer();
writer.setName("沉默王二");
System.out.println(writer.getName());
Class clazz = Class.forName("com.itwanger.s39.Writer");
Constructor constructor = clazz.getConstructor();
Object object = constructor.newInstance();
Method setNameMethod = clazz.getMethod("setName", String.class);
setNameMethod.invoke(object, "沉默王二");
Method getNameMethod = clazz.getMethod("getName");
System.out.println(getNameMethod.invoke(object));
}
}