为什么我不能使用object.variable_name从其他类调用变量?

时间:2015-09-14 11:53:15

标签: java

我刚刚开始学习Java,我正在尝试自己测试一些东西。下面是我收到错误的代码。我试图使用class Demo的对象在class B中调用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.Error:未解析的编译   问题:一个无法解决或者不是一个领域   Demo.main(Demo.java:7)

2 个答案:

答案 0 :(得分:2)

因为在

class B {
    public void test() {
        int a = 10;
    }
}

atest方法的局部变量。如果你想做的事情是可能的,那么在

这样的场景中应该使用什么值
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类字段

无论如何,如果您想要访问仅在方法test中创建和使用的变量的值,您可以更改此方法以返回此值。换句话说,你可以像

一样重写它
public int test1() {
    int a = 10;
    //... you can do something with a
    return a;
}

现在,在Demo课程的主要方法中,您可以使用int result = obj.test();

答案 1 :(得分:1)

您可以随时致电,但这需要在范围内以及当前上下文有权访问时。

System.out.println("printing that variable "+obj.a);

您不能这样做,因为变量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注意:在运行程序之前始终解决所有编译错误:)