在java中,“类方法不能访问实例变量”是什么意思

class Member
{
static int classVar;
int instanceVar;
static void setClassVar(int i)
{
classVar=i;
}
static int getClassVar()
{
return classVar;
}
void setInstanceVar(int i)
{
classVar=i;
instanceVar=i;
}
int getInstanceVar()
{
return instanceVar;
}
}
public class MemberTest
{
public static void main(String args[])
{
Member m1=new Member();
Member m2=new Member();
m1.setClassVar(1);
m2.setClassVar(2);
System.out.println("m1.classVar="+m1.getClassVar()+"m2.classVar="+m2.getClassVar());
}
}

以上的程序为什么得出来的结果是m1.classVar=2m2.classVar=2,而不是m1.classVar=1
谢谢

静态变量存在内存的DATA SEGMENT中,m1和m2的classVar都对它进行引用,m1.classVar和m2.classVar里面存的地址一样,执行m1.setClassVar(1);classVar的值被赋值为1;现在m2.的classVar因为和m1.classVar所指的一样;所以也是1,执行m2.setClassVar(2);classVar的值被赋值为2;m1.classVar和m2.classVar里面存的地址一样,m1.classVar也跟着改变为2。
m1.classVar和m2.classVar所指一样,m1和m2不管谁改变静态变量,另一个也会跟着改变
你在m1.setClassVar(1);后面加上System.out.println("m1.classVar=" + m1.getClassVar() + "m2.classVar="+ m2.getClassVar());输出是m1.classVar=1m2.classVar=1也就是这个原因。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-24
类方法只能访问类变量,而实例方法既可以访问类变量,也可以实例变量
静态方法和静态变量是属于这个类的,只有一份,用类名.方法名来访问,而实例变量是每一个类的实例都有一份的,所以可以理解为静态变量和方法对于一个类的所有实例都是一样的,而实例变量对于每个实例是不同的,所以如果在静态方法里使用的实例变量会造成一致性的问题,
第2个回答  推荐于2016-07-09
你看的材料写的不够好,应该是静态方法不能访问实例变量。
因为静态方法和静态变量是属于这个类的,只有一份,用类名.方法名来访问,而实例变量是每一个类的实例都有一份的,所以可以理解为静态变量和方法对于一个类的所有实例都是一样的,而实例变量对于每个实例是不同的,所以如果在静态方法里使用的实例变量会造成一致性的问题,不知道这么说你能理解吗?
还有就是静态方法和变量与实例方法和变量的存储位置也是不同的,静态方法和变量存储在堆栈中,而实例变量和方法存储在堆中追问

谢谢,问题我重新补充了,麻烦你再看一下好吗?谢谢了

追答

就是我上面说的静态方法和静态变量每个类只有一份,所以说Member类只能有一份static int classVar;这个变量,那就可以知道了m1.classVar = m2.classVar = Member.classVar,所以说你在m2中为classVar赋值了就是为这个类的classVar赋值了,所以m1.classVar 也等于2

本回答被提问者采纳

JAVA中类中的实例方法可以操作类变量(static变量)吗?类方法(static方法...
调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。静态变量 静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,...

实例变量是什么JAVA
在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。类的每个对象维护它自己的一份实例变量的副本。当一个对象被实例化之后,每个实例变量的值就跟着确定。实例变量在对象创建的时候创建,在对象被销毁的时候销毁。实例变量的值应该至少被一...

java 中,什么是实例变量(Instance Variables)
实例变量就是实例化该类对象才调用的非静态变量!class A{ int i;\/\/实例变量 public void mack() { int m =1;\/\/局部变量 } } 单你new 一个A的对象的时候!对象就会在内存中为i分配一个内存!你就可以调用该变量!单你调用mack方法时候才会为m分配内存进行调用!

java中为什么实例方法可以调用实例变量也可以调用类变量,而类方法只能...
实例方法随着实例的产生而产生,随着实例的消亡而消亡。并且实例方法是存储在内存中的堆中的,每一个实例,就在内存中存在一个该方法的副本 类方法是static的,和实例没有关系,存储在栈中,多个实例共享一个类方法。类如果直接调用方法,由于在内存中没有初始化,内存中不存在实例方法,所以类不能调用...

java中什么是实例变量,类变量,局部变量??
每个实例都将有实例变量的一个拷贝,它们可以修改实例变量的值,而不会影响其他的实例;而类变量只有一个拷贝,修改它的值将影响所有的实例。只在特定的过程或函数中可以访问的变量,被称为局部变量。与局部变量相对应的,是全局变量。全局变量就是从定义的位置起,作用域覆盖整个程序范围的变量。局部变量...

实例变量与类变量的区别
其它对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;1、实例变量:定义在类中但在任何方法之外,实例变量的作用域在本类中完全有效,当被其他的类调用的时候也可能有效;2、类变量:在java中,类的实例变量和静态变量称为类属变量或数据域。

java中静态变量和实例变量的区别?
在Java类中,静态变量和实例变量的概念与区别是编程中经常讨论的主题。静态变量,也被称作类变量,由static修饰符定义。它们存储在类的内存空间中,而不仅仅是属于某一个对象实例。这意味着,不管类被实例化多少次,静态变量只会有一个实例,可以被所有实例共享。静态变量和静态常量统称为静态成员。与之...

能以通俗易懂的的方式给我解释一下java中实例变量的定义吗?最好举一...
实例变量还是会有值!实例变量是声明在类中而不是方法中,局部变量是生命在方法中的,局部变量没有默认值,在使用前必须初始化,如果在变量初始前要使用的话,编译器就会报错。public class B { String a;public void A(){ String b="";} } 这个a就是实例变量,b就是局部变量 ...

java中类变量和实例变量的实质区别?
由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,也即,static方法只能处理static域或静态方法。实例方法可以访问实例域, 静态域或静态方法, 记住都行。声明为static的方法有以下几条限制: 1.它们仅能调用其他的static方法。2.它们只能访问...

JAVA举例说明类变量、实例变量、类方法、实例方法在声明和使用时的区别...
即所有的实例共享一个类变量。例如一个银行帐户(Account)是一个class的话,可以把他的利息设为类变量(static float interest),而持有人是实例变量(String name), 这样只要改变 Account.interest就可以把所有人的利息都该了,而持有人的姓名则是属于单独的帐户的。

相似回答