【问题标题】:How to use a variable of one method in another method?如何在另一种方法中使用一种方法的变量?
【发布时间】:2012-03-10 06:02:58
【问题描述】:

我想知道如何在方法Scores() 中使用变量a[i][j] 在以下代码中的方法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();

 }  
}

提前致谢。

【问题讨论】:

  • 公共类 Test3 { private double[][] a= new double[3][5];

标签: java methods multidimensional-array


【解决方案1】:

你不能。在方法中定义的变量是该方法的本地变量。

如果要在方法之间共享变量,则需要将它们指定为类的成员变量。或者,您可以将它们作为参数从一种方法传递给另一种方法(这并不总是适用)。

【讨论】:

  • 这不是 100% 正确的。如果您在方法之间传递对象,例如ArrayLists 并修改其中的一个值,该值也会在调用方法中被修改。
【解决方案2】:

看起来您使用的是实例方法而不是静态方法。

如果您不想创建对象,则应将所有方法声明为静态,例如

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 方法中创建数组并将其作为参数传递给每个方法,但解释其工作原理本身可能是一个全新的问题,所以我将就这样吧。

【讨论】:

    【解决方案3】:

    只需移动a 的声明,使其成为Test3 类的私有属性,如下所示:

    public class Test3 {
    
      private double[][] a;
      public void Scores() { 
       a= new double[3][5];
       int i,j;
    ...etc...
    

    【讨论】:

      【解决方案4】:

      只需将 a[i][j] 作为类变量,在 Scores() 之外声明它,就在类名下方

      public class Test3 {
        double[][] a= new double[3][5];
        public void Scores() { 
         ....
        }
        .....
      }
      

      【讨论】:

        【解决方案5】:

        您可以将二维数组指针声明为该类的成员。然后在成员函数中声明大小和值。在这种情况下,您可以通过其他功能访问它。..

        查看这段代码中 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);
            } 
        }
        

        【讨论】:

          【解决方案6】:

          传入一个参数或创建一个类 var

          【讨论】:

            【解决方案7】:

            如果您希望能够使用二维矩阵 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 的一个字段。 当您在函数中声明变量时,它是该函数的本地变量。其他函数等看不到它。如果将其声明为类字段,则您的函数可以看到它。看看这个,因为它可能会有所帮助。语言/VariableScope.htm">http://www.java2s.com/Tutorial/Java/0020_Language/VariableScope.htm 术语“范围”仅指变量的生命周期以及可以看到的位置。希望这会有所帮助!

            【讨论】:

            • 注意:如果您这样做并测试方法“public static void main(String args)”中的代码,那么您需要通过执行“Test3 instance = new Test3”来创建类的实例()'。然后用'instance.Scores()'调用方法。
            【解决方案8】:
            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();
            
             }  
            }
            

            【讨论】:

              【解决方案9】:
                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();
                  }
              
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-03-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-06-18
                • 2018-08-25
                相关资源
                最近更新 更多