读书人

java中static步骤疑惑

发布时间: 2012-11-04 10:42:41 作者: rapoo

java中static方法疑惑

近期自己在研究java编程思想,是第三版的;书中关于描述静态方法方面自己存在疑惑;

在中文第三版37页写道“和其他任何方法一样,static方法可以创建或使用与其它类型相同的被命名对象,因此,static方法常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群。”;

不知这句话怎么理解。main方法是static方法,但是为什么非要是static不是很清楚;

还有就是在第三版102页写道“static方法就是没有this的方法”这句话没有理解明白,书中好像说的也不是很详细;

自己还是个初学者,希望各位给个解答;先谢过了;

1 楼 MegRyan 2007-11-21 牧羊人那句话我也不太懂

static方法要求要求不创建实例就能用的
this的含义就是调用本方法的那个对象的引用 而static方法不需要对应那个对象
而且从存储的角度来看static方法内部也不能用this引用

不知道我的理解对不对 2 楼 movingboy 2007-11-21 这两句话真要解释起来似乎比较麻烦,一说可能得扯些让你更糊涂的东西出来
不懂没有关系,先学其它的,以后自然就懂了 3 楼 jiyanliang 2007-11-21 MegRyan 写道牧羊人那句话我也不太懂

static方法要求要求不创建实例就能用的
this的含义就是调用本方法的那个对象的引用 而static方法不需要对应那个对象
而且从存储的角度来看static方法内部也不能用this引用

不知道我的理解对不对

你说从存储的角度分析,能否说的清楚一点呢;
我想知道的是:
static方法和static属性是不是存储在一个地方的; 4 楼 jiyanliang 2007-11-21 movingboy 写道这两句话真要解释起来似乎比较麻烦,一说可能得扯些让你更糊涂的东西出来
不懂没有关系,先学其它的,以后自然就懂了
一开始我也这样想的,但是两年下来了,也应该回头学了; 5 楼 movingboy 2007-11-21 1.“static方法常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群”,我想这句话可以理解为这个类起到了class factory的作用,而这个static方法则是factory method。class factory的其中一个作用就是封装创建对象的具体过程,调用者不需要自己创建对象;更进一步,可以为class factory加上管理对象的功能,这样调用者也不需要管理对象的生命周期了。有兴趣可看看设计模式中的template method、class factory及abstract class factory

2.static方法可以直接调用,不需要创建实例。假定有个类Sample,它有个static方法doSomething,程序中创建了一个Sample的实例instance。要执行doSomething,你可以Sample.doSomething,也可以instance.doSomething,两者的作用是一样的。我不确信Java是否这样,但有的语言甚至可以执行类似下面的这条语句:

((Sample)Null).doSomething

简单地讲,JVM把静态方法集中放在某个地方,当要执行某个静态方法,JVM通过类型地址+方法偏移地址在该区域中查找。执行static方法不需要创建实例,查找方法的地址时也不需要实例的地址(即this指针,C++术语)。从另一方面来讲,static方法也有个限制:不能直接访问实例变量。比如在Sample中声明了一个变量,并且没有用static来修饰它,在doSomething中访问了这个变量将导致编译时出错 6 楼 jiyanliang 2007-11-21 movingboy 写道1.“static方法常常拿来做‘牧羊人’的角色,负责看护与其隶属同一类型的实例群”,我想这句话可以理解为这个类起到了class factory的作用,而这个static方法则是factory method。class factory的其中一个作用就是封装创建对象的具体过程,调用者不需要自己创建对象;更进一步,可以为class factory加上管理对象的功能,这样调用者也不需要管理对象的生命周期了。有兴趣可看看设计模式中的template method、class factory及abstract class factory
多谢解答,设计模式还在学习;



movingboy 写道
简单地讲,JVM把静态方法集中放在某个地方,当要执行某个静态方法,JVM通过类型地址+方法偏移地址在该区域中查找。执行static方法不需要创建实例,查找方法的地址时也不需要实例的地址(即this指针,C++术语)。从另一方面来讲,static方法也有个限制:不能直接访问实例变量。比如在Sample中声明了一个变量,并且没有用static来修饰它,在doSomething中访问了这个变量将导致编译时出错
我想知道的是这里的类型地址就是包含这个静态方法的类的地址吧;而方法偏移地址是该方法在堆中的地址吧;它们这些地址应该都是存在于堆栈中的吧;静态变量是是存储在另一块静态存储区还是在栈中呢;
7 楼 movingboy 2007-11-21 先说一句:静态存储区、堆、栈是不同的概念哦

静态变量、静态方法和非静态方法的地址都存储在静态存储区中,但对于后者而言,因为实例的类型在运行时才知道,所以实例还会保存一份虚拟方法的地址转换表
比如instance是一个声明为Sample类型的变量,而实际上它是子类ConcreteSample的实例,要执行它的doSomething方法就要先找到instance的地址+Sample类型的doSomething方法的偏移地址,该地址保存了ConcreteSample的doSomething方法的地址,找到这个地址才能执行该方法。这就是为什么调用虚拟方法比调用非虚拟方法要多一点开销
注意:非静态方法与虚拟方法并非完全一致的概念,只是我没有仔细地区分了 8 楼 jiyanliang 2007-11-22 movingboy 写道先说一句:静态存储区、堆、栈是不同的概念哦

静态变量、静态方法和非静态方法的地址都存储在静态存储区中,但对于后者而言,因为实例的类型在运行时才知道,所以实例还会保存一份虚拟方法的地址转换表
比如instance是一个声明为Sample类型的变量,而实际上它是子类ConcreteSample的实例,要执行它的doSomething方法就要先找到instance的地址+Sample类型的doSomething方法的偏移地址,该地址保存了ConcreteSample的doSomething方法的地址,找到这个地址才能执行该方法。这就是为什么调用虚拟方法比调用非虚拟方法要多一点开销
注意:非静态方法与虚拟方法并非完全一致的概念,只是我没有仔细地区分了
非静态方法的地址竟然不是保存栈中而是保存在静态存储区?? 9 楼 movingboy 2007-11-22 又查了一下资料,方法(包括静态方法和非静态方法)的地址是在程序加载的时候定好的,不是存在静态存储区的
唉,我竟然被你搞糊涂了~~~

读书人网 >其他相关

热点推荐