当前位置: 首页 > 面试题库 >

从其他方法传递变量值

姚伟
2023-03-14
问题内容

我已经解决了这个问题好几个小时,并且取得了长足的进步(在很大程度上要感谢搜索本网站并应用在类似问题中发现的技巧),但是现在看来我陷入了僵局。请浏览一下我所做的事情,或者指出我做错了什么地方,并提供伪代码进行更正,或者为我提供可以弥补我的理解空白的资源。我真的感觉好像我只是缺少一个微小的细节,使这个话题对我来说很有意义。

应用程序的目的是根据用户输入的2个分子和2个分母来添加,减去,乘和除分数(是的,这是用于课程分配,因此请不要提供源代码,而应提供关于我在哪里的指针)在概念上错了)。我将其分为多个步骤,第一步是获取用户的输入并将其输出以供确认。

方法文件:

package Fractions;
import java.util.Scanner;

public class FractionValues
{
    // Declare integer class variables for package Fractions
    int fracNum1;
    int fracDenom1;
    int fracNum2;
    int fracDenom2;

    // Obtain four integers from user input and output to console as two fractions
    public static void getFractions(int fracNum1, int fracDenom1, int fracNum2, int fracDenom2)
    {
        Scanner inInt = new Scanner(System.in);

        System.out.println("Enter an integer for the numerator of the first " +
                                    "fraction:  ");
            fracNum1 = inInt.nextInt();

        System.out.println("Enter an integer for the denominator of the first " +
                                    "fraction:  ");
            fracDenom1 = inInt.nextInt();

        System.out.println("Enter an integer for the numerator of the second " +
                                    "fraction:  ");
            fracNum2 = inInt.nextInt();

        System.out.println("Enter an integer for the denominator fo the second " +
                                    "fraction:  ");
            fracDenom2 = inInt.nextInt();
        System.out.println("===================================================" +
                                    "=================");
    }

    // Return values of variables from input for use in other classes
    public int getFracNum1()        {return fracNum1;}
    public int getFracDenom1()      {return fracDenom1;}
    public int getFracNum2()        {return fracNum2;}
    public int getFracDenom2()      {return fracDenom2;}    
}

主方法文件:

package Fractions;
public class TestFractions2
{
    public static void main(String[] args)
    {
        // Call getFractions method to assign variables from user input
        FractionValues newFracNum1 = new FractionValues();
        newFracNum1.getFracNum1();

        FractionValues newFracDenom1 = new FractionValues();
        newFracDenom1.getFracDenom1();

        FractionValues newFracNum2 = new FractionValues();
        newFracNum2.getFracNum2();

        FractionValues newFracDenom2 = new FractionValues();
        newFracDenom2.getFracDenom2();

        System.out.println("You entered " + newFracNum1.getFracNum1() + "/" + newFracDenom1.getFracDenom2() + " and " +
                                     newFracNum2.getFracNum2() + "/" + newFracDenom2.getFracDenom2() + " as your fractions.");
    }
}

至少经过一些努力,两个文件现在都可以编译。但是,该应用程序无法正常工作。这是我得到的输出:

您输入0/0和0/0作为分数。

一旦这部分起作用,我将添加一个if语句,提示用户响应他们是否希望继续选择,还是返回到输入提示。

根据以下宝贵的反馈意见和作业限制,我得到了以下几点:

package Fractions;
import java.util.Scanner;

public class FractionValues
{
    int fracNum1;
    int fracDenom1;
    int fracNum2;
    int fracDenom2;

    Scanner inInt = new Scanner(System.in);

    // Obtain four integers from user input
    public int getFracNum1()
    {
        System.out.println("Enter an integer for the first numerator:  ");
        return fracNum1 = inInt.nextInt();
    }

    public int getFracDenom1()      
    {
        System.out.println("Enter an integer for the first denominator:  ");
        return fracDenom1   = inInt.nextInt();
    }

    public int getFracNum2()
    {
        System.out.println("Enter an integer for the second numerator:  ");
        return fracNum2     = inInt.nextInt();
    }

    public int getFracDenom2()
    {
        System.out.println("Enter an integer for the second denominator:  ");
        return fracDenom2   = inInt.nextInt();
    }
}

主要应用方法:

package Fractions;
public class TestFractions2
{
    public static void main(String[] args)
    {
        // Call FractionValues methods to assign variables from user input
        FractionValues newFracNum1 = new FractionValues(); 
        FractionValues newFracDenom1 = new FractionValues(); 
        FractionValues newFracNum2 = new FractionValues(); 
        FractionValues newFracDenom2 = new FractionValues();

        System.out.println("You entered " + newFracNum1.getFracNum1() + "/" + 
                newFracDenom1.getFracDenom2() + " and " + newFracNum2.getFracNum2() +
                "/" + newFracDenom2.getFracDenom2() + " as your fractions."); 
    }
}

这两个文件都可以正确编译,并且得到以下预期输出:

输入第一个分子
的整数:2输入第二个分母
的整数:5输入第二个分母的整数:
6输入第二个分母的整数:
3您输入了2/5和6/3作为分数。

非常感谢您对方法和构造函数的帮助,以及对命名约定的建设性评论。您的意见带给我的地方很可能使我从考试不及格提高了!即使在一个 非常有
耐心的朋友的帮助下,我也一直在为这个概念而苦苦挣扎。


问题答案:

代码有一些问题。首先,您看到的输出toString()是在Object类(所有类(包括GetFractions最终从中派生))中找到的默认实现的产物。重写此方法以返回实例的字符串表示形式:

@Override
public String toString() {
  return ...
}

public static void main(String[] args) {
  ...
  System.out.println("..." + newFracNum1 + "...");
}

或者代替传递实例以System.out.println()传递成员访问方法调用的结果(此类方法称为getter):

public double getSomeValue() {
  return ...
}

public static void main(String[] args) {
  ...
  System.out.println("..." + newFracNum1.getSomeValue() + "...");
}

注意,double其他基本类型将自动转换为字符串。

其次,您的静态GetFractions()方法修改了无效的参数(由于按值传递,因此没人会看到更改)。该方法应该修改现有实例的同名实例变量,然后不应该是静态的,或者应该是一种工厂方法,该方法根据用户提供的数据创建新实例,在这种情况下,它将值传递给构造函数或者它应该是构造函数本身。无论哪种方式,您都不想修改方法的参数。这是三种解决方案的概述:

从输入流中读取数据的非静态方法:

public void fromStream(InputStream inStream) {
  // Read data from inStream into instance variables fracNum1, fracDenom1,...
}

静态工厂方法:

public static GetFractions fromStream(InputStream inStream) {
  int fracNum1,... ;
  // Read data from inStream into local variables fracNume1, ...
  return new GetFractions(fracNum1, ...);
}

构造函数:

public GetFractions(InputStream inStream) {
  // Read data from inStream to initialize instance variables fracNum1, fracDenom1,...
}

还请注意,将an传递InputStream给所有这些方法比硬编码具有更大的灵活性System.in

第三,您应该重新考虑您的命名约定。虽然可能的是,与类相同的静态方法的调用通常是一种不好的做法。此外,建议使用名词表达式调用类和对象,并使用动词表达式调用方法。这有助于设计您的类并使代码更具可读性。GetFractions更适合作为方法的名称而不是类。Fractions将使一个更好的类名。



 类似资料:
  • 问题内容: 我正在尝试使用当前位置在android中提交用户注册表格。我是android和java开发的新手。当我尝试在我的名称值对代码中访问onLocationChanged方法的myLat和myLan时,无法同时找到这两个变量。如何访问我的名称/值对代码中的两个变量。 问题答案: 您可能应该研究范围和成员变量。问题是,您不能在一个方法中声明一件事,然后尝试从另一方法访问它。 因此,我们将该事物

  • 帮助我使用这段代码:我得到这个错误。 注意:第5行C:\xampp\htdocs\project\core\functions\general.php中未定义的变量:dbCon 警告:mysqli_real_escape_string()要求参数1为mysqli,null在C:\xampp\htdocs\project\core\functions\general.php第5行中给出 注意:第5行

  • 以下是经典的实践中的一致性: 当线程A写入一个易失性变量,随后线程B读取相同的变量时,A在写入易失性变量之前可见的所有变量的值在读取易失性变量后变得对B可见。 我不确定我真的能理解这句话。例如,在这种情况下,所有变量的含义是什么?这是否意味着使用对使用非volatile变量也有副作用<在我看来,这句话有一些我无法理解的微妙含义<有什么帮助吗?

  • 问题内容: 我试图将选择的A类“获取”方法传递给B类中的方法。我已经将Java PassMethod作为Parameter签出,但是我无法以合理的方式采用接口方法解决问题。我宁愿 不 使用Java 8(lambdas),并尽可能避免反射。我的感觉是,我以错误的方式看待自己的问题。这是我要完成的工作的特定简化示例: 我有一个包含一些字段和get-method的类: 接下来,我将主类实例化为Map的V

  • 问题内容: 如何将值从javascript变量传递到razor变量,asp.net mvc razor视图引擎是否可能? 问题答案: 你不能 原因是他们不在同一时间“生活”。Razor变量是“服务器端变量”,在将页面发送到“客户端”后,它们不再存在。 当服务器收到视图请求时,它仅使用HTML,CSS和Javascript代码创建视图。没有C#代码,所有这些都被“翻译”为客户端语言。 当视图仍在服务

  • 问题内容: 我在将值从JS传递到PHP时遇到问题,以便可以将其用作PHP函数的参数。一旦单击链接,JS函数将由onclick事件触发。这是JS + HTML代码: PHP(insert.php): 感谢您能为我提供帮助的人。我对PHP和JS还是很陌生,所以请原谅我的愚蠢。 问题答案: 您将数据从浏览器传递到服务器。Javascript是一种用于操纵浏览器的语言。PHP是您的服务器端语言。 您可以在