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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈冬冬 中级黑马   /  2014-6-1 10:14  /  2147 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

静态方法不能访问非静态方法,主函数是静态的,为什么主函数就能访问非静态的呢?

21 个回复

倒序浏览
主方法内的函数调用着不能直接访问非静态的成员,可以通过创建对象的方法访问。
回复 使用道具 举报
因为他们的出现时间不一样的。
静态方法随类文件的加载而加载,非静态方法随对象的创建而加载,
当对象消亡啦,非静态方法就不存在了,这时,类和静态方法可能还没有消亡,那么这个时候静态方法再去调用非静态方法,就不行啦。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报 1 0
楼上好解  解决了我这么多年不明白的为什么问题
回复 使用道具 举报
多一点 发表于 2014-6-1 10:42
因为他们的出现时间不一样的。
静态方法随类文件的加载而加载,非静态方法随对象的创建而加载,
当对象消亡 ...

为什么主函数是静态的能访问非静态的方法呢?
回复 使用道具 举报
主函数也是不能直接调用非静态方法的,
要先实例化一个对象,再通过实例去调用非静态方法
静态方法和静态变量随类的加载而加载,类加载时对象还没有被实例化,
而非静态成员和非静态方法只有在对象被实例化时才会在内存中初始化,
也就是说加载静态方法时内存中还没有非静态成员和非静态方法,
那么自然静态方法是不能调用非静态成员和非静态方法

  1. class Demo
  2. {
  3.          public static void main(String[] args)
  4.          {
  5.                   //Test();          //直接调用编译时会提示“无法从静态上下文中引用非静态方法”
  6.                   Demo a=new Demo();    //先实例化一个对象
  7.                   a.Test();                           //通过实例调用非静态方法
  8.          }
  9.          public void Test()
  10.          {
  11.                   System.out.println("This is a test");
  12.          }
  13. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
主函数也不能直接访问非静态方法吧
回复 使用道具 举报
主函数是静态的。
   
   静态的利弊
   利:对 对象的共享数据进行单独空间的存储,节省空间,没有必要没一个对象中都存储一份
   可以直接被类名所调用
   弊:生命周期过长,访问出现局限性(只能访问静态)

回复 使用道具 举报
陈冬冬 发表于 2014-6-1 11:37
为什么主函数是静态的能访问非静态的方法呢?

在主函数里要创建对象才可以 ,不创建对象还是不可以的,不信你自己去试试
回复 使用道具 举报
主函数必须访问静态的方法或则变量
回复 使用道具 举报
如果访问非晶态的东西,必须要创建对象才可以,主函数先加载内存的,因为它是入口
回复 使用道具 举报
有了实例对象就可以
回复 使用道具 举报
Lex 中级黑马 2014-6-1 19:04:57
13#
跟生命周期有关
回复 使用道具 举报
本帖最后由 格子、 于 2014-6-2 08:03 编辑

首先我们要明确两点:
1.主函数静态的原因
      主函数之所以是静态的,是因为是程序执行的入口,它会被jvm虚拟机首先调用,并且执行main方法中的代码,如果不是静态,就是必须建立对象访问,试问一下,如果虚拟机都找到程序的入口,不行代码的话怎么去创建对象呢?所以主函数静态是必须的,她要在对象在建立前,这样才能被调用。
2.主函数确实是不可以访问非静态。一般我们在有主函数的类里边都是定义的静态方法,主要就是因为主函数也是静态的,在主函数里可以直接调用,否则,就得先创建对象,才能访问非静态方法!!!
回复 使用道具 举报
静态方法&非静态方法

静态方法   :随着类的加载而加载,可以被类名直接调用存在时间周期长,可以直接访问静态方法和静态常量,对于访问非静态方法,必须先对非静态方法进行实例化,否则会出现“无法从静态上下文中访问非静态方法” 。定义静态方法的主要原因是,他可以共享,没有必要每次需要都需要进行定义,节省了内存空间。

非静态方法:必须进行实例化,才真正存活在内存中,由于其存在时间周期短,这也是为什么有人会问为什么不都把方法定义为静态的。实例化之后可以访问非静态方法,也可以访问静态方法和静态常量,因为他们是共享数据,
回复 使用道具 举报
西门吹风 发表于 2014-6-1 12:10
主函数也是不能直接调用非静态方法的,
要先实例化一个对象,再通过实例去调用非静态方法
静态方法和静态变 ...

学习了。。。。
回复 使用道具 举报
我觉得:主函数是不能直接访问非静态方法的,它访问的非静态方法是通过对象引用的调用而利用的,并非直接访问非静态方法。
回复 使用道具 举报
这个有点难度
回复 使用道具 举报
明白了不少
回复 使用道具 举报
没有例外,都不能
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马