黑马程序员技术交流社区

标题: 静态的疑问 [打印本页]

作者: 陈冬冬    时间: 2014-6-1 10:14
标题: 静态的疑问
静态方法不能访问非静态方法,主函数是静态的,为什么主函数就能访问非静态的呢?

作者: sheng6699    时间: 2014-6-1 10:35
主方法内的函数调用着不能直接访问非静态的成员,可以通过创建对象的方法访问。
作者: 多一点    时间: 2014-6-1 10:42
因为他们的出现时间不一样的。
静态方法随类文件的加载而加载,非静态方法随对象的创建而加载,
当对象消亡啦,非静态方法就不存在了,这时,类和静态方法可能还没有消亡,那么这个时候静态方法再去调用非静态方法,就不行啦。

作者: Hi天天向上    时间: 2014-6-1 11:27
楼上好解  解决了我这么多年不明白的为什么问题

作者: 陈冬冬    时间: 2014-6-1 11:37
多一点 发表于 2014-6-1 10:42
因为他们的出现时间不一样的。
静态方法随类文件的加载而加载,非静态方法随对象的创建而加载,
当对象消亡 ...

为什么主函数是静态的能访问非静态的方法呢?
作者: 西门吹风    时间: 2014-6-1 12:10
主函数也是不能直接调用非静态方法的,
要先实例化一个对象,再通过实例去调用非静态方法
静态方法和静态变量随类的加载而加载,类加载时对象还没有被实例化,
而非静态成员和非静态方法只有在对象被实例化时才会在内存中初始化,
也就是说加载静态方法时内存中还没有非静态成员和非静态方法,
那么自然静态方法是不能调用非静态成员和非静态方法

  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. }
复制代码


作者: 执笔梦    时间: 2014-6-1 15:56
主函数也不能直接访问非静态方法吧
作者: fenzheng    时间: 2014-6-1 16:13
主函数是静态的。
   
   静态的利弊
   利:对 对象的共享数据进行单独空间的存储,节省空间,没有必要没一个对象中都存储一份
   可以直接被类名所调用
   弊:生命周期过长,访问出现局限性(只能访问静态)


作者: 多一点    时间: 2014-6-1 16:14
陈冬冬 发表于 2014-6-1 11:37
为什么主函数是静态的能访问非静态的方法呢?

在主函数里要创建对象才可以 ,不创建对象还是不可以的,不信你自己去试试
作者: fenzheng    时间: 2014-6-1 16:18
主函数必须访问静态的方法或则变量
作者: fenzheng    时间: 2014-6-1 16:19
如果访问非晶态的东西,必须要创建对象才可以,主函数先加载内存的,因为它是入口
作者: 葛晓东    时间: 2014-6-1 18:57
有了实例对象就可以
作者: Lex    时间: 2014-6-1 19:04
跟生命周期有关
作者: 格子、    时间: 2014-6-1 19:09
本帖最后由 格子、 于 2014-6-2 08:03 编辑

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

作者: 姿_`态    时间: 2014-6-1 19:23
静态方法&非静态方法

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

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

学习了。。。。
作者: 跑步先生    时间: 2014-7-1 12:31
我觉得:主函数是不能直接访问非静态方法的,它访问的非静态方法是通过对象引用的调用而利用的,并非直接访问非静态方法。
作者: e644638045    时间: 2014-7-1 14:43
这个有点难度
作者: 微笑女皇    时间: 2014-7-1 16:02
明白了不少
作者: 人心如水    时间: 2014-7-1 18:11
没有例外,都不能
作者: gtf    时间: 2014-7-1 20:59
西门吹风 发表于 2014-6-1 12:10
主函数也是不能直接调用非静态方法的,
要先实例化一个对象,再通过实例去调用非静态方法
静态方法和静态变 ...

讲解的很详细,受教了。
作者: endian11    时间: 2014-7-1 21:03
主函数怎么能调用非静态方法那,应该不可以啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2