我们如何在函数外部使用参数变量而不将其存储到另一个变量中?

时间:2013-09-25 15:58:17

标签: java

我们如何在函数外部使用参数变量而不将其存储到另一个变量中? 示例:如果我想通过用户输入读取值作为参数??

,则为SAY
public class CC {

    public int f(int a, int b) {
        int d, c;
        d = a;
        c = b;
        return a + b;
    } // want to use a & b outside

    public int q(int a, int b) {
        return a + b; // re-initial-is- will delete the previous parameter value;
    }

    public int w() {
        int p = a + b; // error:cannot access or resolve a & b into variables
        return p;
    }

    public int e() {
        int u = d + c; // works but this is not the solution
        return u;
    }

    public static void main(String args[]) {
        CC obj = new CC();
        obj.f(3, 4);
        obj.q(8, 9);
        obj.w();
        obj.e();
    }

}

2 个答案:

答案 0 :(得分:4)

  

我们如何在函数外部使用参数变量而不将其存储到另一个变量中?

这是不可能的。局部变量的范围仅限于声明它们的方法。所有局部变量都存储在该方法的堆栈帧中。当方法返回时,堆栈帧被销毁,因此所有局部变量和参数都将丢失。

引自JVM Specification - Frames

  

框架用于存储数据和部分结果,以及   执行动态链接,返回方法的值和调度   异常。

     

每次调用方法时都会创建一个新帧。 框架是   无论如何,在方法调用完成时销毁   完成是正常的或突然的(它抛出未捕获的异常)。   帧是从Java虚拟机堆栈(第2.5.2节)中分配的   创建框架的线程。每个帧都有自己的本地数组   变量(第2.6.1节),它自己的操作数堆栈(第2.6.2节)和对它的引用   当前类的运行时常量池(第2.5.5节)   方法


话虽如此,似乎ab应该是你班级的领域。然后通过将参数传递给构造函数或通过setter方法设置它们。这就是编写面向对象代码的方法。浏览Oracle tutorial on Classes

例如,参加一个简单的课程:

class Operation {
    private int a;
    private int b;

    public Operation(int a, int b) { 
        this.a = a; this.b = b;
    }

    public int sum() {
        return a + b;
    } 
}

现在,您通过传递参数来创建此类的实例,稍后将在sum()方法中使用该参数:

Operation operation = new Operation(4, 5);
System.out.println(operation.sum());

您可以沿此行修改课程。请为您的班级和变量选择一个更好的名称。还要遵循标准的Java命名约定。

答案 1 :(得分:0)

ab创建字段,并使用参数在f()中初始化它们。

,例如:

public class CC{

private int a;
private int b;
private int d;
private int c;

public int f(int a,int b)
 {
  d=a;
  c=b;
  this.a = a;
  this.b = b;
 return a+b; 
 } //want to use a & b outside

public int q(int a, int b)
 {
   return a+b; //re-initial-is- will delete the previous parameter value;
  }

public int w(){
 int p=a+b; //error:cannot access or resolve a & b into variables
 return p;
 }

public int e(){
 int u=d+c; //works but this is not the solution

 return u;
}

 public static void main(String args[]){
 CC obj=new CC();
 System.out.println(obj.f(3,4));
 System.out.println(obj.q(8,9));
 System.out.println(obj.w());
 System.out.println(obj.e());
 } 
}

这会将以下内容打印到控制台:

7
17
7
7

但是,字段的使用取决于您要执行的操作。

例如,如果您想要使用 a b 一次(用于计算 a + b ) ,然后使用新值重置它们,并且能够同时使用旧值和新值,您需要执行以下操作:

package test;

public class CC {

private int a;
private int b;
private int d;
private int c;

public int f(int initialA, int initialB) {
    this.a = initialA;
    this.b = initialB;
    return a+b; 
} //want to use a & b outside

public int q(int resetA, int resetB) {
    // Move values for a + b to other variables for re-use
    this.c = a;
    this.d = b;
    this.a = resetA;
    this.b = resetB;
    return a+b; //re-initial-is- will delete the previous parameter value;
}

public int w() {
    // Use the initial values
    int p = c + d;
    return p;
}

public int e() {
    // Use the reset values
    int u = a + b; //works but this is not the solution
    return u;
}

public static void main(String args[]){
    CC obj = new CC();
    System.out.println(obj.f(3,4));
    System.out.println(obj.q(8,9));
    System.out.println(obj.w());
    System.out.println(obj.e());
} 
}

这会将以下内容打印到控制台:

7
17
7
17