什么是符号引用? 概念模糊啊

wlalw131415 2011-06-22 05:59:02
我说说我的理解哈, 用个例子来说吧


public class Test {

public void printf() {
System.out.println(java.lang.Math.PI);

java.util.Date date = new java.util.Date();
java.text.DateFormat df = new java.text.simpleDateFormat("yyyy-MM-dd");
String sDate = df.format(date);
System.out.println(sDate);

}

}


1、这个类里的“java.lang.Math.PI”、“date”、“df.format(date)”和“java.util.Date”是否就是所谓的符号引用?
2、如果不对请举例说一下什么是符号引用
3、我对符号引用的理解:java源程序里除了关键字和基本类型的变量外, 其他的都是符号引用啊?
4、请指出这个类里所有的符号引用

谢谢!
...全文
1385 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangmlabc 2012-02-26
  • 打赏
  • 举报
回复
根据这篇文章 http://yfxuchao.iteye.com/blog/849908
貌似5楼的没有说错
wangmlabc 2012-02-26
  • 打赏
  • 举报
回复
谁能给个官方解释吗,或者谁能给个 符号引用的 英文原名吗?
我看看能不能找到官方的解释,最近在看《深入理解java虚拟机》
虽然接触java三四年了,第一次碰到这些词语,还有个叫做字面量的词语
tongtian24 2011-12-28
  • 打赏
  • 举报
回复
2L和5L的观点不一样了!JVM中的符号引用不包含实例的变量,但是5L的例子用String s ="abc",这个S是实例变量,不能算是符号引用!
tongtian24 2011-12-28
  • 打赏
  • 举报
回复
2L和5L的观点不一样了!JVM中的符号引用不包含实例的变量,但是5L的例子用String s ="abc",这个S是实例变量,不能算是符号引用!
TKD03072010 2011-06-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qybao 的回复:]

我的理解

符号引用,顾名思义,就是一个符号,符号引用被使用的时候,才会解析这个符号。如果熟悉linux或unix系统的,可以把这个符号引用看作一个文件的软链接,当使用这个软连接的时候,才会真正解析它,展开它找到实际的文件

对于符号引用,在类加载层面上讨论比较多,源码级别只是一个形式上的讨论。
当一个类被加载时,该类所用到的别的类的符号引用都会保存在常量池,实际代码执行的时候,首次遇……
[/Quote]
学习了!!!
lyhmy 2011-06-23
  • 打赏
  • 举报
回复
学习了,多点掌握了
菜继续 2011-06-23
  • 打赏
  • 举报
回复
友情UP,接点分~~
qybao 2011-06-22
  • 打赏
  • 举报
回复 3
我的理解

符号引用,顾名思义,就是一个符号,符号引用被使用的时候,才会解析这个符号。如果熟悉linux或unix系统的,可以把这个符号引用看作一个文件的软链接,当使用这个软连接的时候,才会真正解析它,展开它找到实际的文件

对于符号引用,在类加载层面上讨论比较多,源码级别只是一个形式上的讨论。
当一个类被加载时,该类所用到的别的类符号引用都会保存在常量池,实际代码执行的时候,首次遇到某个别的类时,JVM会对常量池的该类的符号引用展开,转为直接引用,这样下次再遇到同样的类型时,JVM就不再解析,而直接使用这个已经被解析过的直接引用。
除了上述的类加载过程的符号引用说法,对于源码级别来说,就是依照引用的解析过程来区别代码中某些数据属于符号引用还是直接引用,如,System.out.println("test" + "abc");//这里发生的效果相当于直接引用,而假设某个String s = "abc"; System.out.println("test" + s);//这里的发生的效果相当于符号引用,即把s展开解析,也就相当于s是"abc"的一个符号链接,也就是说在编译的时候,class文件并没有直接展看s,而把这个s看作一个符号,在实际的代码执行时,才会展开这个s



龙四 2011-06-22
  • 打赏
  • 举报
回复
在java源码层次上应该很少有符号引用的概念吧

在解析常量池的时候有很多符号引用
飞跃颠峰 2011-06-22
  • 打赏
  • 举报
回复
修正一下,漏了PrintStream

java.lang.System
java.lang.System.out
java.io.PrentStream
java.io.PrentStream.println(dboule)
java.lang.Math
java.lang.Math.PI
java.util.Date
java.util.Date.Date()
java.text.DateFormat
java.text.DateFormat.format(java.util.Date)
java.text.simpleDateFormat
java.text.simpleDateFormat.simpleDateFormat(java.lang.String)
java.lang.String
飞跃颠峰 2011-06-22
  • 打赏
  • 举报
回复
补充一点:符号引用应该包含所有的信息以便能唯一地定位到该类/接口/方法/字段
飞跃颠峰 2011-06-22
  • 打赏
  • 举报
回复
说下我的理解,如有不对,欢迎指正。

符号引用是针对类和类中的方法和字段而言的,在加载类的时候被转换为直接引用,应该不包括实例中的变量。

举例来说,这段代码中符号引用包括:
java.lang.System
java.lang.System.out
java.lang.System.out.println(dboule)
java.lang.Math
java.lang.Math.PI
java.util.Date
java.util.Date.Date()
java.text.DateFormat
java.text.DateFormat.format(java.util.Date)
java.text.simpleDateFormat
java.text.simpleDateFormat.simpleDateFormat(java.lang.String)
java.lang.String

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧