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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐溪永 黑马帝   /  2012-2-21 09:32  /  2808 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

是否可以从一个static方法内部发出对非static方法的调用?为什么呢

10 个回复

倒序浏览
不行,
可以这样理解
static修饰的方法可以直接用类名调用
非static修饰的方法必须用类new出对象才能调用
当我们用类名直接调用时,可能这个类的对象并没有new。
如果这时候static方法里调用非static的方法就会出现空指针异常,
当然这种错误编译时就不会通过

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
因为在装载class得时候static方法首先完成,此时非static属性和方法还没有完成初始化,要构造方法调用后才初始化可用。。。所以不能调用。
回复 使用道具 举报
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
回复 使用道具 举报
本帖最后由 许圣建 于 2012-2-21 11:59 编辑

都是可以实现的,但是这并不是java静态方法的出现目的,你在静态方法内部创建一个本类对象就行了,main函数是不是静态,他是不是可以使用所有的方法,只不过类方法更简洁,对象方法处理的更具针对性。
一个工具的使用最优方法一般在它被创造时已经明确了,因需创造,而不是创造后找使用的地方,类方法就是整个类的方法,
非静态方法就是个体对象的方法,我们当然希望所有的方法都是类方法,可是那样要定义多少个类,语言是现实世界的抽象和描述,合乎人的世界观
回复 使用道具 举报
这样是不可以的,因为static方法调用的时候不需要创建对象,而非static方法必须创建对象之后才可以被调用,
回复 使用道具 举报
袁野 黑马帝 2012-2-21 13:23:24
7#
我的是这样理解的 静态的方法是先跟着类进行加载。非静态是跟随对象加载的  先加载类 后加载的对象 所以在静态方法里不可以调用非静态的方法 ,反之则才可以
回复 使用道具 举报
程序加载入虚拟机时,静态方法被调入内存可以直接使用;非静态方法必须初始化(New())后才能使用,所以非要使用的话,要先new所在类。
回复 使用道具 举报
这样应该是不行的。因为对static修饰的,是类成员的,是所有对象都共享的。而非static的是每一个实例对象所特有的。
static在类载的时候就存在了,是生命周期最长的,而实例对象是在new的时候才会存在。
回复 使用道具 举报
static是公共的,只要你程序加载的时候这个并会自动运行,但是我想应该是可以在里面调用非静态的对象,但是在那之前你必须先要对先进行创建与初始化
回复 使用道具 举报
不能,因为static是随着类的加载已存在,优先于类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马