A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zeus00456 中级黑马   /  2014-8-17 19:19  /  1521 人查看  /  5 人回复  /   3 人收藏 转载请遵从CC协议 禁止商业使用本文

这句话属于贫道灵光一闪,特与大家分享:

static的作用就是:将“成员对对象的依赖关系”转嫁到类的身上

稍微解释一下
本来,类中的成员都是对一类事物特性或是功能的概括(或称描述、或称抽取、或称模型化)
但是,实际上用到了这些成员的是类的实例,也就是对象,成员实际上只在成员的身上发挥作用。
可以这么理解,类上的成员仅仅是描述概括抽取以及模型,都是虚的;只有由类创建的对象才具有这些“描述概括抽取以及模型”的实际作用,是具体的。只有在一个类的对象中这些“描述概括抽取以及模型”才是具体的属性和功能(请注意区分“具体的属性和功能”与“特性或是功能的概括”的区别)
上面的内容可以概括为——成员与对象具有依赖关系

而static的作用就是转嫁这种关系,static解除了成员对对象的依赖(使被static修饰的成员仅仅用类就可以使用),并且将这种依赖关系挂在了类本身身上(随类生(加载),随类死(释放))。

需要提一下的是,类与成员本来就是密切相关的,成员就是实际的事物抽象成类时概括来的,是定义在类中的,是对类的直接描述,是类的一个方面的体现。
所以,将static的作用概括为:《解除“成员对对象”的依赖关系》也是可以的(个人认为)。

欢迎各位对本帖内容进行交流^_^

5 个回复

倒序浏览
:)                                                               
回复 使用道具 举报
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
回复 使用道具 举报
分析得很精辟,总结很好,点赞
回复 使用道具 举报
hsy 来自手机 中级黑马 2014-8-17 22:23:07
报纸
一句话:可以被成员共享,类和对象都可以调用。
回复 使用道具 举报
hsy 发表于 2014-8-17 22:23
一句话:可以被成员共享,类和对象都可以调用。

楼上的说法确实也可以(但是不是“被成员”,而是被“本类对象共享”,注意这是不同的概念,估计楼上是打错了),但是以我的拙见(我刚刚仔细斟酌了一下),楼上概括的只是原因之上的现象。
而原因(比较靠近本质的)正是我说的“转嫁依赖关系”,而不是“被成员共享”(顺便提一嘴,“共享”和“被本类对象共享”是不同的,当然,在这里没有什么关系):因为被转嫁了关系,所以出现了共享的现象。

我这样说是因为两个原因(不是我吃多了非得整出几个不同的说法来,有原因的哦),
其一,从内存的角度。
非static的成员是写在对象中的(对象在堆里),这就是“成员是依赖于对象”的底层依据,它内存中就是这样的。
而static的成员,保存的区域是在静态区,静态区也叫方法区(也有说是方法区的一部分,但在我们正在讨论的问题中差别不大),方法区是存放类(当然,严格的说法是“类的信息”)的地方(请注意区于分字节码对象)。具体是这样的,当一个类被用到时,类的信息会存储到方法区,在这一片存储了类的信息的区域中有一块空间,用来保存其中的静态内容(static的内容存在“保存类信息”的区域),所以说“静态成员的依赖关系被转移到了类”。

其二,“共享”的说法不能解释一个案例。
有一个流,叫做对象操作流(ObjectOutputStream / ObjectInputStream),可以实现对象的永久化保存。但是对象中的静态信息(尤指静态成员的值)会丢失。
楼上所说的共享,在实际中是一个很受限制的概念。举个反胃的例子,就好像是公共厕所一样,大家在共享公厕,但是没有人持有公厕(共享厕所的人都不拥有这个厕所),这个厕所是借给人们用的(所有人用的都是这一个厕所)。
这一来,将共享换个“访问”貌似也行,但是,对于这个“共享”楼上可能更强调了“操作唯一的变量”这一层意思,因为只要一个对象更改了这个成员则其他成员访问到的都是这个更改后的值。
类将静态成员借给了对象使用,但对象并不持有这些成员,正是这种不持有,造成了上面案例的信息丢失。
有人看到这里可能已经懵了,这和案例有什么关系。这么说吧,如果用共享解释,对象在永久化保存(说白了就是写入到文件中)时,将堆中对象的信息写入到文件后,对于静态内容就算不能将静态区中的信息剪切走,好歹可以复制一份吧(复制的结果就是静态信息被作为对象的一部分永久保存了);然而,结果是显而易见的,就连复制一份都是不允许的,所以会丢失静态的值。这就是证明了——静态成员和你对象没关系,所以不让你带走。
有人会说,虽然值没带走,但是将被永久化的对象导入内存,还是可以访问这些成员的,只不过值是默认的而已。咱别从这里绕了成不,如果连成员名都不你留下,你不就不能访问这些成员了吗,这仅仅是作为静态成员所有者的类宽宏大量的让你保有访问权而已;真正访问到的东西,补不起,那跟你对象没关系,不给。

以上,就是我对于“转嫁依赖”与“对象共享”的对比分析,请各位看官笑纳。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马