【问题标题】:When I call SetA from main and then call show method of class B , Variable value resets to zero当我从 main 调用 SetA 然后调用 B 类的 show 方法时,变量值重置为零
【发布时间】:2020-11-03 19:55:40
【问题描述】:
class A
{
 Int a =0;
   public void SetA(){ //setting a value to 20
    a = 20;
   }
}
class B
   {
     public void show(){
      SetA obj =new SetA();
      System.Out.Println(obj.a)
      }
}

首先从主方法中,我在 A 类中调用 SetA 方法,然后在 B 类中调用 show 方法,但即使我为 int a 设置值,它仍然返回零。有人请解释我为什么会发生这种情况以及我该如何解决这个问题。如何使用 SetA 方法中设置的值从任何其他类访问变量 a?

【问题讨论】:

  • public void SetA() 不是构造函数,它是您永远不会调用的方法。删除void
  • 您的代码有编译错误。您必须使用构造函数来创建 A 的对象。
  • 另外,没有类型“Int”。您应该使用“int”或“Integer”。

标签: java variables scope return-value


【解决方案1】:

您永远不会调用方法 SetA(尽管您尝试使用它而不是 A 构造函数)。

A obj =new A();
obj.SetA();
System.out.println(obj.a);

Demo

【讨论】:

    【解决方案2】:

    A 类中的a 变量是instance variable

    在面向对象的类编程中,实例变量是 在类中定义的变量(即成员变量),每个 类的实例化对象具有单独的副本或实例。

    因此,A 类的每个实例都将有一个单独的“a”副本,该副本与所有其他类 A 实例单独更改。

    B 类的show() 方法中,您正在创建一个新的、单独的类A 实例,该实例不同于您之前操作的A 实例。 a 的默认值为零,这就是为什么这是您将看到的唯一值。

    如果您希望 show()A 的特定实例一起使用,那么您必须将该实例作为参数传递:

    public void show(A someInstanceOfA) {
        System.Out.Println(someInstanceOfA.a)
    }
    

    请注意,我们不是在 show() 中使用 new 关键字创建类 A 的实例。我们只是在操作或使用通过someInstanceOfA 参数传入的本地引用。

    这是一个完整的示例,展示了 a 类是如何被 B 类操作的:

    public class A
    {
    
       private int a=0;
       
       public void setA(int value) { 
           a = value;
       }
       
       public int getA() {
           return a;
       }
       
    }
    
    public class B
    {
        
        public void show(A someInstanceOfA) {
            System.out.println("B.show(): a = " + someInstanceOfA.getA());
            someInstanceOfA.setA(10); // this will modify the instance of A and be reflected back in main()
        }
        
    }
    
    public class Driver
    {
        
        public static void main(String[] args) {
            A instanceA = new A();
            instanceA.setA(5);
            System.out.println("Before: a = " + instanceA.getA());
            
            B instanceB = new B();
            instanceB.show(instanceA);
            
            System.out.println("After: a = " + instanceA.getA());
        }
        
    }
    

    输出:

    Before: a = 5
    B.show(): a = 5
    After: a = 10
    

    【讨论】:

    • 感谢您的简短解释!
    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 2016-06-14
    • 2014-04-29
    • 2017-06-11
    • 2014-10-29
    • 1970-01-01
    • 2013-06-12
    • 2020-03-21
    相关资源
    最近更新 更多