Как использовать переменную одного метода в другом методе? - PullRequest
4 голосов
/ 19 февраля 2012

Я хочу знать, как использовать переменную a[i][j] в методе Scores(), чтобы использовать ее в методах MD() и sumD() в следующем коде:

В моем коде методы MD() и sumD() не могут получить результат.

public class Test3 {

  public void Scores() { 
   double[][] a= new double[3][5];
   int i,j;

   for(i=0; i<3; i++ ){
        for(j=0; j<5; j++){
                a[i][j]= (double) Math.random(); 
                System.out.println("a[" + i + "][" + j + "] = " +a[i][j]);
        }   
   }   
}
  public void MD(){
   double[][] b =new double[3][5];
   int [] m = new int[5];
   int i,j;
   //double[][] a= new double[3][5];

   for(j= 0; j<5; j++)
        for(i=0 ; i<3 ; i++) 
        {
           b[i][j]=0.0;                                                    
           if(a[i][j]>0.0) 
              m[j]++;
        }   
    for(j= 0; j<5; j++){
        for(i=0 ; i<3 ; i++) {
           if(a[i][j] > 0.0){
               b[i][j]=a[i][j]*m[j];
               System.out.println("b[" + i + "][" + j + "] = " + b[i][j]);
           }    
       }        
   }                
}

public void sumD(){

int i,j,n;
double[] sum= new double[3];
double[] k= new double[3];
//double[][] a= new double[3][5];

  for(i=0; i<3; i++){
      n=0;
      sum[i]=0.0;
      for(j=0; j<5; j++){
          if(a[i][j]>0.0){
              sum[i] += (a[i][j])*2;
              n++;
          }                
      }
      k[i]=sum[i]/n;
      System.out.println("k[" + i + "] = " + k[i]); 
 }
}

public static void main(String[] args){
    Test3 print= new Test3();
    print.Scores();
    print.MD();
    print.sumD();

 }  
}

Заранее спасибо.

Ответы [ 9 ]

13 голосов
/ 19 февраля 2012

Вы не можете.Переменные, определенные внутри метода, являются локальными для этого метода.

Если вы хотите разделить переменные между методами, вам нужно будет указать их как переменные-члены класса.Кроме того, вы можете передавать их из одного метода в другой в качестве аргументов (это не всегда применимо).

5 голосов
/ 19 февраля 2012

Похоже, вы используете методы экземпляра вместо статических.

Если вы не хотите создавать объект, вы должны объявить все ваши методы статическими, что-то вроде

private static void methodName(Argument args...)

Если вы хотите, чтобы переменная была доступна всем этим методам, вы должны инициализировать ее вне методов и ограничить ее область действия, объявив ее закрытой.

private static int[][] array = new int[3][5];

На глобальные переменные обычно смотрят свысока (особенно в таких ситуациях, как ваша), потому что в крупномасштабной программе они могут нанести ущерб, поэтому, сделав их закрытыми, вы по крайней мере предотвратите некоторые проблемы.

Кроме того, я скажу, как обычно: вы должны стараться, чтобы ваш код был немного аккуратнее. Используйте описательные имена классов, методов и переменных и сохраняйте ваш код аккуратным (с правильными отступами, переносами строк и т. Д.) И согласованными.

Вот последний (сокращенный) пример того, каким должен быть ваш код:

public class Test3 {
    //Use this array in your methods
    private static int[][] scores = new int[3][5];

    /* Rather than just "Scores" name it so people know what
     * to expect
     */
    private static void createScores() {
        //Code...
    }
    //Other methods...

    /* Since you're now using static methods, you don't 
     * have to initialise an object and call its methods.
     */
    public static void main(String[] args){
        createScores();
        MD();   //Don't know what these do
        sumD(); //so I'll leave them.
    }
}

В идеале, поскольку вы используете массив, вы должны создать массив в методе main и передать его в качестве аргумента для каждого метода, но объяснение того, как это работает, вероятно, является совершенно новым вопросом, поэтому я буду оставь это на этом.

2 голосов
/ 19 февраля 2012

Просто переместите объявление a, чтобы сделать его частным свойством класса Test3, например:

public class Test3 {

  private double[][] a;
  public void Scores() { 
   a= new double[3][5];
   int i,j;
...etc...
1 голос
/ 09 июля 2016

вы можете объявить 2-й указатель массива как член класса.Затем объявите размер и значение внутри функции-члена.В этом случае вы можете получить к нему доступ из другой функции.

См. Использование T [] [] в этом коде

    public class Knapsack {

    //private static Scanner in;
    int T[][];

    int MaximumVal(int wt[],int val[], int total){
        int l=total;
        int m=val.length;
        T = new int[m+1][l+1];

        for (int i=0; i<=m; i++){
            for(int j=0; j<=l; j++){
                if(i==0 || j==0){
                    T[i][j]=0;
                    continue;
                }
                if(j-wt[i-1] >= 0){
                    T[i][j]=Math.max(T[i-1][j], val[i-1]+T[i-1][j-wt[i-1]]);
                }
                else{
                    T[i][j]=T[i-1][j];
                }
            }
        }
        return T[m][l];
    }

    void PrintPath(int wt[], int val[]){
        int i=T.length-1;
        int j=T[0].length-1;
        while(j!=0){
            if(i>0){
                while(T[i][j]==T[i-1][j]){
                    i--;
                }
            }
            System.out.print(wt[i-1]+" ");
            j=j-wt[i-1];
            i--;
        }
    }


    //Main Function with test case ::

    public static void main(String args[]){
        int wt[]={1,3,4,5};
        int val[]={1,4,5,7};
        Knapsack K = new Knapsack();

        System.out.print("Enter the total value:  ");
        //in = new Scanner(System.in);
        //int total = in.nextInt();

        int result = K.MaximumVal(wt,val,7); // pass total
        System.out.println("Total value is "+ result);

        K.PrintPath(wt,val);
    } 
}
1 голос
/ 19 февраля 2012

просто сделайте [i] [j] как переменную класса, объявите его вне Scores(), чуть ниже имени класса

public class Test3 {
  double[][] a= new double[3][5];
  public void Scores() { 
   ....
  }
  .....
}
0 голосов
/ 07 августа 2017
  public class Practise {
    String a;

    public String getA() {
        return a;
    }
    public void setA(String a) {
        this.a = a;
    }
    void meth1(){

        this.setA("asd");

    System.out.println(a);


    }
    void meth2(){

        String b="qwerty";
        System.out.println(getA()+" "+b);

    }


    public static void main(String[] args) {

        Practise p= new Practise();
        p.meth1();
        p.meth2();
    }

}
0 голосов
/ 30 июня 2014
public class Test3 {
  double[][] a=new double[3][5];
  public void Scores() { 

   int i,j;

   for(i=0; i<3; i++ ){
        for(j=0; j<5; j++){
                a[i][j]= (double) Math.random(); 
                System.out.println("a[" + i + "][" + j + "] = " +a[i][j]);
        }   
   }   
}
  public void MD(){
   double[][] b =new double[3][5];
   int [] m = new int[5];
   int i,j;
   //double[][] a= new double[3][5];

   for(j= 0; j<5; j++)
        for(i=0 ; i<3 ; i++) 
        {
           b[i][j]=0.0;                                                    
           if(a[i][j]>0.0) 
              m[j]++;
        }   
    for(j= 0; j<5; j++){
        for(i=0 ; i<3 ; i++) {
           if(a[i][j] > 0.0){
               b[i][j]=a[i][j]*m[j];
               System.out.println("b[" + i + "][" + j + "] = " + b[i][j]);
           }    
       }        
   }                
}

public void sumD(){

int i,j,n;
double[] sum= new double[3];
double[] k= new double[3];
//double[][] a= new double[3][5];

  for(i=0; i<3; i++){
      n=0;
      sum[i]=0.0;
      for(j=0; j<5; j++){
          if(a[i][j]>0.0){
              sum[i] += (a[i][j])*2;
              n++;
          }                
      }
      k[i]=sum[i]/n;
       System.out.println("k[" + i + "] = " + k[i]); 
  }
}

public static void main(String[] args){
    Test3 print= new Test3();
    print.Scores();
    print.MD();
    print.sumD();

 }  
}
0 голосов
/ 19 февраля 2012

Если вы хотите использовать 2d-матрицу a, вам нужно объявить ее вне ваших методов.

public class Test3 {
    double[][] a= new double[3][5]; 

    public void Scores() { 
       //double[][] a= new double[3][5];  
       int i,j;

       for(i=0; i<3; i++ ){
          for(j=0; j<5; j++){
            a[i][j]= (double) Math.random(); 
            System.out.println("a[" + i + "][" + j + "] = " +a[i][j]);
          }   
       }   
    }
    .......

Вы увидите, что я переместил объявление a (раньше внутри Scores (), и который я закомментировал) за пределами функции, и теперь это поле класса Test3. Когда вы объявляете переменную внутри функции, она является локальной для этой функции.Его не видят другие функции и т. Д. Если вы объявите его как поле класса, ваши функции смогут его увидеть. Посмотрите на это, так как это может помочь.Language / VariableScope.htm "> http://www.java2s.com/Tutorial/Java/0020_Language/VariableScope.htm Термин« область действия »означает только время жизни переменной и место, где ее можно увидеть. Надеюсь, это поможет!

0 голосов
/ 19 февраля 2012

Передайте аргумент или создайте класс var

...