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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾_强 中级黑马   /  2012-4-30 23:42  /  2505 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 jiyixuan 于 2012-4-30 23:50 编辑

毕老师关于static 静态使用注意事项总结有:
1、静态方法只能访问静态成员(方法、变量)。
        非静态方法可以访问静态成员吗?可以!!!即可以访问静态,也可以访问非静态。
2、静态方法中不可以定义this,super关键字。
        因为静态优先于对象存在,所以静态方法中不可以出现this。
3、主函数是静态的。

我的问题是:

静态方法不允许调用非静态的属性和方法,只能调用静态的属性和方法。但是主函数也是静态啊,那么主函数(static方法)调用非静态方法的原理是什么呀?

另外在主函数(static方法)中我们经常创建某个类的实例,再利用其引用变量调用它的非静态方法?是不是说明在主函数中可以通过某种方法实现调用非静态方法?具体是什么原理?


以上请大牛们不吝赐教。不甚感激。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 贾联国 于 2012-5-1 00:08 编辑

main是不能直接调用自己的非静态方法的,只不过是需实例化过才行,也就是说NEW个自己的对象接收返回值就搞定了。没有返回值的直接new方法。
例子多的是,翻翻毕老师的视频,里面也出现过
回复 使用道具 举报
主函数也是不能直接调用非静态方法的,可以分两种情况说明:
(1)当该非静态方法与主函数在一个类中,示例代码如下:
  1. class StaticDemo
  2. {
  3. public void run()
  4. {
  5. System.out.println("run");
  6. }

  7. public static void main(String[] args)
  8. {
  9. //调用run方法的方式
  10. }
  11. }
复制代码
对于这种情况,如果想调用非静态的run方法,只能是创建本类的对象,StaticDemo sd = new StaticDemo();
然后对象调用sd.run();如果run方法是静态的,那直接调用run()。
(2)该静态方法与主函数不在同一类中,示例代码如下
  1. class Static
  2. {
  3. public void run()
  4. {
  5. System.out.println("run");
  6. }
  7. }

  8. class StaticDemo
  9. {
  10. public static void main(String[] args)
  11. {
  12. //调用run()方法的方式
  13. }
  14. }
复制代码
如果在主函数中调用非静态run方法,也是只能创建所属类的对象,Static s = new Static();然后对象调用s.run();这都和上面是一样的。
如果如果run方法是静态的,那直接类名调用Static.run()(思想与上面是一样的)。
所以可以看出主函数也是不能直接调用非静态的方法的。




评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 袁冬梅 于 2012-5-1 07:12 编辑
  1. class LaoPo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 LaoPo.declaration();
  6.                 LaoPo xxx = new LaoPo();//创建一个老婆xxx出来,然后就可以吩咐xxx给你织围巾啦!
  7.                 xxx.xiangZhiWeiJin();//xxx老婆想织围巾了,于是她就自己织围巾了。
  8.         }
  9.         public static void declaration()
  10.         {
  11.                 /*
  12.                 这个方法是静态方法。它的生命周期和类的一样长,也就是说类一加载,它就跟着出现了。所以,这个方法是不知道这个类会创建哪些实例对象的。它不可以调用本身具有this.这个句柄的类成员。
  13.                 比方说:你不可能知道10年后你老婆会是具体的谁,所以,肯定是不能让这个未知的她给你织围巾的啦!
  14.                 */
  15.                 System.out.println("只给老公织围巾!!(#‵′)凸");
  16.         }
  17.         public void xiangZhiWeiJin()
  18.         {
  19.                 /*
  20.                 织围巾之类的事,肯定是有某个具有特定名字[可以称呼出名字来]的老婆来织的,也就是说,你得把这个老婆创建出来,才能调用这个方法,让这个老婆想织围巾,然后再自己去织围巾。
  21.                 这个函数是非静态的,也就是说它是和某个老婆对象关联的。注意this这个关键字,官方说法是:它代表的是本类对象。这个类里面的话它代表的就是LaoPo这个类可能将要创建的某个老婆对象,比如xxx。
  22.                 */
  23.                 System.out.println("想织条围巾给老公呀!!");
  24.                 this.zhiWeiJin();
  25.         }
  26.                 public void zhiWeiJin()
  27.         {
  28.                 System.out.println("织围巾!");
  29.         }        
  30. }
  31. 上面的就是玩笑的,估计你会越看越混乱,其实看下面的总结也足够了O(∩_∩)O~
  32. 总结:静态方法(包括主函数)不能直接调用非静态方法。
  33. 如果想要调用一个非静态方法,那么就必须先在这个静态方法中创建那个非静态方法所属的类的对象,然后再由那个对象去调用非静态方法。
复制代码
额,我来说说吧!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马