在java中,一个java类将会编译成一个class文件。在编译时,java类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。比如org.simple.People类引用org.simple.Tool类,在编译时People类并不知道Tool类的实际内存地址,因此只能使用符号org.simple.Tool(假设)来表示Tool类的地址。而在类装载器装载People类时,此时可以通过虚拟机获取Tool类 的实际内存地址,因此便可以既将符号org.simple.Tool替换为Tool类的实际内存地址,及直接引用地址。
总结:JVM对于直接引用和符号引用的处理是有区别的,可以看到符号引用时,JVM将使用StringBuilder来完成字符串的 添加,而直接引用时则直接使用String来完成;直接引用永远比符号引用效率更快,但实际应用开发中不可能全用直接引用,要提高效能可以考虑按虚拟机的思维来编写你的程序。
1.0 直接引用:
public class StringAndStringBuilder{
public static void main(String[] args){
System.out.println ("s=" + "asdfa");
}
}
2.0 符号引用:
public class StringAndStringBuilder{
public static void main(String[] args){
String s="asdfa";
System.out.println ("s=" + s);
}
}
- /**
- *
- */
- package com.bzu.csh;
- import java.util.Random;
- /**
- *
- * 项目名称:Test1 类名称:Test2 类描述: 创建人:admin 创建时间:2017年1月7日 下午9:41:36 修改人:admin
- * 修改时间:2017年1月7日 下午9:41:36 修改备注:
- *
- * @version
- *
- */
- class Test4 {
- public static final int i = 6 / 2;// 编译时就处理了,即i =
- // 3;不初始化类,static代码块和静态初始化块不执行
- public static final int j = new Random().nextInt();// 运行时处理,需要初始化类,都执行
- static {
- System.out.println("static 静态代码块");
- }
- {
- System.out.println("初始化块");
- }
- }
- public class Test3 {
- /**
- * @param args
- * 2017年1月7日
- */
- public static void main(String[] args) {
- System.out.println(Test4.i);
- }
- }
只有主动调用时才初始化类
- /**
- *
- */
- package com.bzu.csh;
- import java.util.Random;
- /**
- *
- * 项目名称:Test1 类名称:Test2 类描述: 创建人:admin 创建时间:2017年1月7日 下午9:41:36 修改人:admin
- * 修改时间:2017年1月7日 下午9:41:36 修改备注:
- *
- * @version
- *
- */
- class Test6 {
- public static final int a = 6 / 2;// 编译时就处理了,即i = 3
- // 3;不初始化类,static代码块和静态初始化块不执行
- public static final int b = new Random().nextInt(10);// 运行时处理,需要初始化类,都执行
- static {
- System.out.println("Test6 static 静态代码块" + a + ":" + b);
- }
- {
- System.out.println("Test6 初始化块");
- }
- }
- class Test4 extends Test6 {
- public static final int i = 6 / 2;// 编译时就处理了,即i = 3
- // 3;不初始化类,static代码块和静态初始化块不执行
- public static final int j = new Random().nextInt(10);// 运行时处理,需要初始化类,都执行
- static {
- System.out.println("Test4 static 静态代码块" + i + ":" + j);
- }
- {
- System.out.println("Test4 初始化块");
- }
- }
- public class Test3 {
- /**
- * @param args
- * 2017年1月7日
- */
- static {
- System.out.println("Test3");
- }
- public static void main(String[] args) {
- // Test4 t = new Test4();结果如下:执行了初始化块
- // Test3
- // Test6 static 静态代码块3:9
- // Test4 static 静态代码块3:0
- // Test6 初始化块
- // Test4 初始化块
- /***********************************************************/
- // System.out.println(Test4.j);// 这个不执行初始化块
- // Test3
- // Test6 static 静态代码块3:4
- // Test4 static 静态代码块3:8
- // 8
- /***********************************************************/
- System.out.println(Test4.b);// 不会初始化Test4,因为b定义在了Test6
- // Test3
- // Test6 static 静态代码块3:8
- // 8
- }
- }