菜问题:无法从静态上下文中引用非静态变量

时间:2022-12-12 16:44:06
int i = 3;

public static void main(String []) {
   System.out.println(i);
}


无法从静态上下文中引用非静态变量i的原因是“非静态成员变量只能通过类的对象实例来调用”这一规定吗?那么在内存中有没有相应的解释?比如说,此时i没有被分配地址?不过我感觉既然它被声明了被初始化了啊,内存中应该有地址了吧。。等等原因?希望有人讲下能否在内存中找到解释?

13 个解决方案

#1


是你说的规定。i不是静态的,在类没有实例化时,地址就无法确定。

#2


补充一句,即便实例化有地址了,因为i是和每个对象相关的,内存中有多个i,不加对象去访问的话也会使系统产生迷惑

#3


基本类型的成员变量,不会有地址,直接存的是值,只有引用类型(对象)才存的地址呢!

#4


引用楼主 derline 的回复:
Java codeint i=3;publicstaticvoid main(String []) {
   System.out.println(i);
}

 无法从静态上下文中引用非静态变量i的原因是“非静态成员变量只能通过类的对象实例来调用”这一规定吗?那么在内存中有没有相应的解释?比如说,此时i没有被分配地址?不过我感觉既然它被声明了被初始化了啊,内存中应该有地址了吧。。等等原因?希望有人讲下能否在内存中找到解释?


任何非静态的成员变量他的内存地址是随着类的实例化而开辟出来的。当类没有被实例化之前,该变量怎么可能有内存地址。i=3这条语句其实存在于类定义中,这是整个类结构的一部分,但是跟类的实例没有关系。

#5


你把int i=3;放到main中吧,程序的入口是那个静态方法main,此时还没有创建类的实例呢

#6


没有实例化这个类时,i的地址是不存在的
可以这么调用
public class Test {
int i = 5;
public static void main(String [] args){

System.out.println(new StringAndStringBuffer().i);
}
}

#7


非静态的成员变量和属性必须先创建出类的对象才能用的。

#8


引用 6 楼 developer_java 的回复:
没有实例化这个类时,i的地址是不存在的
可以这么调用
public class Test {
int i = 5;
public static void main(String [] args){

System.out.println(new StringAndStringBuffer().i);
}
}


路过学习,只是这个StringAndStringBuffer()是什么意思 啊?

#9


我觉得2楼的兄台讲的不错

#10


程度运行, i在内存中,有一个地址,存放的是其值,如果没有创建该类的对象,试问,它与谁有关?如果是静态就不一样了,因为静态成员变量,是在该类中生成,唯一标识的,那么不可能还存在与它相同的成员变量名。所以可以用类直接调用。

        这只是我个人理解啊,错了,请大家批评!

#11


首先了解一下 类创建的过程
先是静态的代码快,包括静态属性和方法;
然后是非静态的
 如果要静态 调用 非静态;顺序就 错了
逻辑就错了
这个问题 必须要明白 类的创建的 过程

#12


将错了 是对象的 创建 过程
呵呵呵 不是类的创建过程

#13


写错了 没改类名 不好意思啊 刚才测StringBuffer来的 应该是new Test()

#1


是你说的规定。i不是静态的,在类没有实例化时,地址就无法确定。

#2


补充一句,即便实例化有地址了,因为i是和每个对象相关的,内存中有多个i,不加对象去访问的话也会使系统产生迷惑

#3


基本类型的成员变量,不会有地址,直接存的是值,只有引用类型(对象)才存的地址呢!

#4


引用楼主 derline 的回复:
Java codeint i=3;publicstaticvoid main(String []) {
   System.out.println(i);
}

 无法从静态上下文中引用非静态变量i的原因是“非静态成员变量只能通过类的对象实例来调用”这一规定吗?那么在内存中有没有相应的解释?比如说,此时i没有被分配地址?不过我感觉既然它被声明了被初始化了啊,内存中应该有地址了吧。。等等原因?希望有人讲下能否在内存中找到解释?


任何非静态的成员变量他的内存地址是随着类的实例化而开辟出来的。当类没有被实例化之前,该变量怎么可能有内存地址。i=3这条语句其实存在于类定义中,这是整个类结构的一部分,但是跟类的实例没有关系。

#5


你把int i=3;放到main中吧,程序的入口是那个静态方法main,此时还没有创建类的实例呢

#6


没有实例化这个类时,i的地址是不存在的
可以这么调用
public class Test {
int i = 5;
public static void main(String [] args){

System.out.println(new StringAndStringBuffer().i);
}
}

#7


非静态的成员变量和属性必须先创建出类的对象才能用的。

#8


引用 6 楼 developer_java 的回复:
没有实例化这个类时,i的地址是不存在的
可以这么调用
public class Test {
int i = 5;
public static void main(String [] args){

System.out.println(new StringAndStringBuffer().i);
}
}


路过学习,只是这个StringAndStringBuffer()是什么意思 啊?

#9


我觉得2楼的兄台讲的不错

#10


程度运行, i在内存中,有一个地址,存放的是其值,如果没有创建该类的对象,试问,它与谁有关?如果是静态就不一样了,因为静态成员变量,是在该类中生成,唯一标识的,那么不可能还存在与它相同的成员变量名。所以可以用类直接调用。

        这只是我个人理解啊,错了,请大家批评!

#11


首先了解一下 类创建的过程
先是静态的代码快,包括静态属性和方法;
然后是非静态的
 如果要静态 调用 非静态;顺序就 错了
逻辑就错了
这个问题 必须要明白 类的创建的 过程

#12


将错了 是对象的 创建 过程
呵呵呵 不是类的创建过程

#13


写错了 没改类名 不好意思啊 刚才测StringBuffer来的 应该是new Test()