Когда я вызываю SetA из основного, а затем вызываю метод show класса B, значение переменной сбрасывается до нуля - PullRequest
0 голосов
/ 14 июля 2020
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)
      }
}

Сначала из основного метода я вызвал метод SetA в классе A, затем вызвал метод show в классе B, но даже когда я устанавливаю значения для int a, он все равно возвращает ноль. Кто-нибудь, пожалуйста, объясните мне, почему это происходит и как я могу решить эту проблему. Как я могу получить доступ к переменной a из любого другого класса со значением, установленным в методе SetA?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Переменная a в классе A является переменной экземпляра :

В объектно-ориентированном программировании с классами переменная экземпляра - это переменная, определенная в class (т.е. переменная-член), для которой каждый экземпляр объекта класса имеет отдельную копию или экземпляр.

Таким образом, каждый экземпляр класса A будет иметь ОТДЕЛЬНУЮ копию 'a' который изменяется индивидуально от всех других экземпляров класса A.

В методе show() класса B вы создаете новый, ОТДЕЛЬНЫЙ экземпляр класса A, который отличается от экземпляра из A, которым вы ранее манипулировали. Значение по умолчанию a равно нулю, поэтому это единственное значение, которое вы увидите.

Если вы хотите, чтобы show() работал с конкретным c экземпляром A, тогда вам нужно будет передать этот экземпляр в качестве параметра:

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

Обратите внимание, что мы НЕ создаем экземпляр класса A с ключевым словом new внутри show(). Мы просто манипулируем или используем локальную ссылку, переданную через параметр 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
1 голос
/ 14 июля 2020

Вы никогда не вызываете метод SetA (хотя вы пытаетесь использовать его вместо конструктора A).

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

Demo

...