当前位置: 技术问答>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方法内声明和作为一个成员变量来声明有什么区别呢???
{
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方法覆盖时,没有起到覆盖的作用
static:
类变量(对象共享)可以用类名,对象名点取,间接使用。
类方法 1)static方法中不能直接使用非静态成员, 因
为非静态成员与实例相关,通过对象点取间接使用
2)static方法中不能用this(与实例相关)
3)非static方法中可以使用static成员
static块:和数据成员时并列的位置,用于类初始化
类装入时执行一次(第一次创建对象,第一次使用
static成员,不同的静态块,按在类中的顺序执行)
注:只能修饰成员,不能修饰方法变量.
static方法覆盖时,没有起到覆盖的作用
|
我觉得这主要不是静态不静态的问题,应该是main()方法的问题。
main()方法是在任何对象被创建之前就会被java解释器调用。如果按照你上面的做法,这时还没有创建mainframe这个对象,所以会报错。
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方法内部的成员变量。
这个错误不是说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是在方法里面声明的局部变量当然不存在什么静态非静态了啊,所以静态方法调用自己方法内部的变量是不会出问题的。
静态非静态是对类的成员变量来说的,不适合局部变量的:)
首先要明确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是在方法里面声明的局部变量当然不存在什么静态非静态了啊,所以静态方法调用自己方法内部的变量是不会出问题的。
静态非静态是对类的成员变量来说的,不适合局部变量的:)