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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  在老毕的讲堂上,说静态函数中,不存在this,看了好几遍还是不能理解,为什么不能在静态中存在this呢。
还有静态函数在什么时候使用?有时候老师讲讲就说这里用静态就解决了。是通过什么方式想到的啊?
求哪位大侠帮助帮助。。。

7 个回复

倒序浏览
静态方法是跟实例无关的方法,只跟类有关,在类没有实例的时候就可以使用其静态方法。静态方法不能操作非静态变量也不能调用非静态方法。
说简单点,就是静态方法可以被类名直接调用。

而this关键字,是因为this是表示被实例化的某类实例本身,只要我上面说的你明白了,你就知道不能在静态方法体里面使用this关键字了。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
什么时候定义静态变量
当对象中出现共享数据时,这个数据应该被静态修饰
什么时候定义静态函数
当功能内部没有访问到非静态数据时 该功能可定义为静态。
静态是随着类加载存在的 是优先于对象存在的   this是代表当前对象的 所以不能用

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 胡卿 于 2012-6-8 23:22 编辑

静态优先于对象的存在,this代表对象,但静态方法建立时没有实例存在,也就不能定义this了

具体说就是:
    静态方法会随着类的建立而建立,而实例是随着对象的建立而建立,在类之后,类建立了,静态成员也就存在了,但实例变量并不存在,而this代表的就是实例对象,既然实例都没有
    建立,当然不能定义this了
回复 使用道具 举报
static修饰的成员随着类的加载存在与方法区中,此时还不存在该类的对象。this指向的调用该成员的对象的引用,也就是说有了对象才有this。所以静态函数中不能使用this关键字。如果楼主还是不太理解。可以去看Java语言规范,哪一章忘记了。。。里面讲的很具体。
在工具类中,常常会用到静态方法。例如Arrays类。另外,我们不希望别人能直接创建类的实例而是使用我们提供的对象,这个时候就可以使用静态方法啊。单例设计模式不就用到了静态方法吗?
回复 使用道具 举报
静态函数和静态成员变量随类的加载而加载,他的内存执行顺序高于你创建实例(对象),静态方法和函数存储在方法区,可以直接用类名调用,他将随着类而存在,生命周期高于对象。this关键字是指向当前对象,在你创建对象之后可以使用。当对象变量名语函数变量名相同时可以用this作为指引,指向当前对象。静态函数只可以访问静态函数和成员变量。
回复 使用道具 举报
静态不与任何实例有关,直接通过类名调用
一般把共享数据用static修饰
回复 使用道具 举报
谈谈我对静态的一点理解吧:首先楼主说的this 关键字是代表该类的一个实例对象。比如定义一个 private int a ;在类内部使用的话就是this.a,在内外部就要new class().a
如果说的有错也请指点           就是要使用非静态的成员的话就必须创建一个实例对象。
                                             对静态成员的访问不需要创建对象的实例,直接用类名.成员的方式来访问。
在内存中的表现形式:
                    非静态的成员都存放在堆内存中,必须要创建对象的引用才能对非静态成员进行访问。
                    而对于用static修饰的静态成员,是在编译Class文件过程中就已经存在于方法区中。
对于什么时候使用 static 修饰成员                                       
                   1.静态变量:当数据是共享数据时定义为静态,比如毕老师视讲的售票系统中票的数量 TicketNum。
                                       多个售票窗口(也即是多个实例对象)对同一个TicketNum进行操作,这个TicketNum就作为共享数据存在
                                       如果是非静态的话,那么每一个实例对象都会创建一个自己的 TicketNum 变量。那么就不能达到对同一个数据进行操作。
                   2.静态常量:对一些固定不变的特有数据应该用静态修饰,比如PI 圆周率。而且要用 public static final 来修饰
                   3.静态函数:当功能内部没有访问到非静态数据时 该功能可定义为静态。这里涉及到对非静态数据的理解,就是你定义的静态方法中
                                       不会涉及到对【该类】对象(也即是this)的引用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马