当前位置:  技术问答>java相关

为什么非静态变量不能用在静态方法上?什么意思?

    来源: 互联网  发布时间:2015-08-14

    本文导语:  class C    { public static void main(String[] args)      {           mainframe.show();      } public MulticastFrame mainframe=new MulticastFrame(); } 这是错误代码。 出现错误是:non-static variable mainframe cannot be referenced from ...

class C
   {
public static void main(String[] args)
     {
          mainframe.show();
     }
public MulticastFrame mainframe=new MulticastFrame();
}
这是错误代码。
出现错误是:non-static variable mainframe cannot be referenced from a static context mainframe.show();

//////////////////////////////////////////////////////////

class C   
{
   public static void main(String[] args)
     {
         MulticastFrame mainframe=new MulticastFrame();
         mainframe.show();
     }
}
为什么改成这样就不会错了呢??为什么说mainframe是个非静态变量
show()是个静态方法呢??
///////////////////////////////////////////////////////////

mainframe这个变量在main方法内声明和作为一个成员变量来声明有什么区别呢???

|
在sun的sl-275中有明确说明:
static:
类变量(对象共享)可以用类名,对象名点取,间接使用。
  类方法 1)static方法中不能直接使用非静态成员, 因
            为非静态成员与实例相关,通过对象点取间接使用
    2)static方法中不能用this(与实例相关)   
     3)非static方法中可以使用static成员      
        static块:和数据成员时并列的位置,用于类初始化
      类装入时执行一次(第一次创建对象,第一次使用
 static成员,不同的静态块,按在类中的顺序执行)
                     注:只能修饰成员,不能修饰方法变量.
                static方法覆盖时,没有起到覆盖的作用

|
我觉得这主要不是静态不静态的问题,应该是main()方法的问题。
main()方法是在任何对象被创建之前就会被java解释器调用。如果按照你上面的做法,这时还没有创建mainframe这个对象,所以会报错。

|
non-static variable mainframe cannot be referenced from a static context mainframe.show();
这个错误不是说show是静态方法。context是上下文,指mainframe.show()方法
所在的位置(main方法里),在这个静态方法main里不能引用非静态变量mainframe.

mainframe这个实例作为一个成员变量来创建的话,在main里执行mainframe.show();的时候,Class C还没有实例,它的成员变量mainframe当然也不存在,所以错误。

mainframe这个实例在main方法内创建的话,它是main方法内部的成员变量。

|
一个声明为非静态的变量确实是不能在静态的方法里面引用的,如果这样会出现一个编译错误,因为我们知道静态的方法可以在没有创建实例时使用,而申明为非静态的成员变量是一个对象属性,它只有在对象存在时引用,但是如果在对象未创建实例时我们调用了它的类方法(静态方法)这时可想而知了(肯定是非法的不能再非法了),所以编译器会在这种时候给各错误.而且java语法这也是不允许的(如同C++一样,静态方法只能引用静态的属性,进行处理).

|
我来解释一下把,不一定对

首先要明确java规范中确实是在静态方法中不能调用非静态方法或则引用非静态变量,这个大家没有问题把

然后我们看这个
class C
   {
public static void main(String[] args)
     {
          mainframe.show();
     }
public MulticastFrame mainframe=new MulticastFrame();
}

这个类里面mainframe没有用static修饰,所以不是非静态成员变量,所以会出错

再看这个


class C   
{
   public static void main(String[] args)
     {
         MulticastFrame mainframe=new MulticastFrame();
         mainframe.show();
     }


}

mainframe是在方法里面声明的局部变量当然不存在什么静态非静态了啊,所以静态方法调用自己方法内部的变量是不会出问题的。

静态非静态是对类的成员变量来说的,不适合局部变量的:)

    
 
 

您可能感兴趣的文章:

  • PHP static局部静态变量和全局静态变量总结
  • java有无像vb那样的静态变量?java的staic是类的属性,那末,静态变量如何声明?
  • 请教:(static)静态变量和静态方法是什么意思?
  • 静态函数,静态变量
  • c++静态局部变量和静态函数示例
  • linux动态链接库里全局变量和静态变量会导致动态库不可重入吗?
  • C#静态变量与实例变量实例分析
  • 类静态变量能定义在成员方法中吗?? 在线
  • 大家快来帮帮我,关于JAVA的类变量:一定在定义成STATIC变量(即静态变量)吗?
  • 问一个静态变量和外部函数的问题。
  • 一个类里的静态方法可以访问这个类里的变量吗?
  • 关于C++静态成员函数访问非静态成员变量的问题
  • 如何不通过全局变量和静态变量与模态对话框进行数据交换?
  • php中的静态变量的基本用法
  • 为什么两个终端的静态变量会相互覆盖?
  • java中静态变量和实例变量的区别详细介绍
  • [scjp问题] 关于静态方法中间的变量调用错误问题
  • 在静态上下文中不能引用非静态变量 this WindowAdapter e=new MyAdapter();why?
  • Android静态变量的生命周期 简单介绍
  • To masterz():本人愚笨,向你再请教一个问题 在静态上下文中不能引用非静态变量 this
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 一个基本概念问题:静态函数只能调用静态方法,类的成员函数也是静态的吗?
  • linux中静态链接库调用了另一个静态链接库
  • 如何 用一个静态库 生成 另一个静态库
  • 有把两个静态库.a合成一个静态库的简单方法吗
  • linux 生成静态库的时候怎么连接别的静态库
  • 静态博客 静态blog
  • 静态库动态库同时存在时,如何指定使用静态库
  • C# 静态方法与非静态方法的区别分析
  • 如何在一个静态链接库中链接另一个静态链接库?
  • gcc的静态库.lib怎末在编译的时候连接。对了静态库是自己的???
  • c#静态方法和非静态方法详细介绍
  • 在静态上下文中不能引用非静态方法test(),天啊,为什么我的main()不能调用任何其它函数?
  • 一个静态库包含多个函数,应用程序连接了库中的某个函数,应用程序目标代码中是否还包含了该静态库中的其他函数代码?
  • 急求静态库引用静态库,该如何编译链接!!!
  • asp.net伪静态后真正的静态文件无法访问的解决方法
  • 请问在LINUX下怎么设置静态IP?我在虚拟机中不能设置静态IP怎么办?
  • makefile.am中生成.a静态库的同时,链接其他.a静态库或.la动态库的问题
  • 静态库,动态库,静态链接和动态链接
  • C# 静态类与非静态类、静态成员的区别分析
  • 能否把一些静态库文件(.a)和.o文件一起打包成一个静态库文件?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3