Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';我是否使用object.variable\u名称从其他类调用变量?_Java - Fatal编程技术网

Java 为什么可以';我是否使用object.variable\u名称从其他类调用变量?

Java 为什么可以';我是否使用object.variable\u名称从其他类调用变量?,java,Java,我刚刚开始学习Java,我正在尝试自己测试一些东西。下面是我遇到错误的代码。我试图使用类B的对象调用类Demo中类B中的局部变量 public class Demo { public static void main(String args[]) { B obj=new B(); System.out.println("printing that variable "+obj.a); } } class B{ public void

我刚刚开始学习Java,我正在尝试自己测试一些东西。下面是我遇到错误的代码。我试图使用
类B
的对象调用
类Demo
中类B中的局部变量

public class Demo {
    public static void main(String args[])
    {
        B obj=new B();
        System.out.println("printing that variable "+obj.a);
    }
}
class B{
    public void test()
    {
        int a=10;
    }
}
输出:

线程“main”java.lang中出现异常。错误:未解析编译 问题:无法解决或不是当前的字段 main(Demo.java:7)

您可以随时调用,但这需要在范围内,并且当当前上下文可以访问时

您不能这样做,因为变量
a
是方法
test()
的本地变量,并且范围仅限于该方法

要立即访问所需的方式,请将其设为实例成员

class B{
int a;  // instance member now
public void test()
{
a=10;
}
}
现在请注意,除非调用方法
test()
,否则默认值仅为
0
。因此,您可能希望将代码更改为

public static void main(String args[])
{
B obj=new B();
obj.test();
System.out.println("printing that variable "+obj.a);
}
如果你根本不想调用一个方法,你可以直接访问
a

public class Demo {
public static void main(String args[])
{
B obj=new B();
System.out.println("printing that variable "+obj.a);
}
}
class B{
public int a= 10;
}
Imp注意:在运行程序之前,请始终解决所有编译错误:),因为

class B {
    public void test() {
        int a = 10;
    }
}
a
test
方法的局部变量。若您试图做的事情是可能的,那个么在这样的场景中应该使用什么值呢

class B {
    public void test1() {
        int a = 10;
    }
    public void test2() {
        int a = 20;
    }
}
a
应该来自
test1
还是来自
test2
?对于编译器来说,这两种方法同样正确,因此它无法为您做出决定,这将导致问题。还请不要忘记,方法可以有几个同名变量,只要它们在不同的作用域中,这就是为什么我们可以有几个
for(int i…)
方法(所以您希望从哪个作用域使用
i

通常,
运算符用于访问类的成员,而不是方法的变量。因此,通过
object.member
您可以访问
object.method()
object.field
。如果你的班级看起来像

class B{
    public int x;
    public void test1() {
        int a = 10;
    }
}
您可以使用
object.b
,因为
b
是b类字段


无论如何,若您想访问创建的变量值,并且仅在方法
测试中使用,您可以更改此方法以返回此值。换句话说,你可以像这样重写它

public int test1() {
    int a = 10;
    //... you can do something with a
    return a;
}

现在在
Demo
类的main方法中,您可以使用
int result=obj.test()

非常感谢:)我正在学习阶段,将再次尝试澄清我的疑问和概念:)@Lamiahart很乐意帮助。如果您真的帮助了您,请将其标记为答案。“未解决的编译问题”不是您的第一条错误消息。是什么?想在你的答案中添加一些东西。同样,B类是默认的。所以这两个类都应该在同一个包中。@这是真的,但不要涉及访问修饰符及其与创建类的位置的关系。同样基于OP示例,我怀疑
B
Demo.java
文件在同一个包中,这意味着它与
Demo
在同一个包中。
public int test1() {
    int a = 10;
    //... you can do something with a
    return a;
}