从方法返回值
Returning Values From Methods
如何打印出点 a-f 的值,而不是让它重复每次输入的内容?我的程序 returns 方程每次也无解,我做错了什么?
public class LinearEquations {
Scanner input = new Scanner(System.in);
private double a, b, c, d, e, f = 0;
double x, y;
public double getA() {
System.out.println("Enter the value of a: ");
double a = input.nextDouble();
return a;
}
public double getB() {
System.out.println("Enter the value of b: ");
double b = input.nextDouble();
return b;
}
public double getC() {
System.out.println("Enter the value of c: ");
double c = input.nextDouble();
return c;
}
public double getD() {
System.out.println("Enter the value of d: ");
double d = input.nextDouble();
return d;
}
public double getE() {
System.out.println("Enter the value of e: ");
double e = input.nextDouble();
return e;
}
public double getF() {
System.out.println("Enter the value of f: ");
double f = input.nextDouble();
return f;
}
public boolean isSolvable() {
if ((a * d) - (b * c) == 0){
return false;
}
return true;
}
public double getX() {
double x = (((e * d) - (b * f)) / ((a * d) - (b * c)));
return x;
}
public double getY() {
double y = (((a * f) - (e * c)) / ((a * d) - (b * c)));
return y;
}
这是主要的class
public static void main(String[] args) {
LinearEquations pointA = new LinearEquations();
LinearEquations pointB = new LinearEquations();
LinearEquations pointC = new LinearEquations();
LinearEquations pointD = new LinearEquations();
LinearEquations pointE = new LinearEquations();
LinearEquations pointF = new LinearEquations();
System.out.println(pointA.getA());
System.out.println(pointB.getB());
System.out.println(pointC.getC());
System.out.println(pointD.getD());
System.out.println(pointE.getE());
System.out.println(pointF.getF());
LinearEquations pointX = new LinearEquations();
LinearEquations pointY = new LinearEquations();
if (pointX.isSolvable() && pointY.isSolvable()) {
System.out.println("x is " + pointX.getX() +
" and y is " + pointY.getY());
} else {
System.out.println("The equation has no solution");
}
您的逻辑有一些问题,您在创建 8 LinearEquation 对象时实际上只需要 1。
public static void main(String[] args) {
LinearEquations theOne = new LinearEquations();
System.out.println(theOne.getA());
System.out.println(theOne.getB());
System.out.println(theOne.getC());
System.out.println(theOne.getD());
System.out.println(theOne.getE());
System.out.println(theOne.getF());
if (theOne.isSolvable()) {
System.out.println("x is " + theOne.getX() +
" and y is " + theOne.getY());
} else {
System.out.println("The equation has no solution");
}
}
在您的方法中,您没有将数据写入 class 成员。您只需在函数内部重新定义一个局部变量并将值写入它即可。
在你的代码中
public double getF() {
System.out.println("Enter the value of f: ");
double f = input.nextDouble();
return f;
}
应该是
public double getF() {
System.out.println("Enter the value of f: ");
this.f = input.nextDouble();
return f;
}
这就在你身边,你有许多对象,每个对象都有一个输入值。您应该只使用具有所有值的一个,这样方程式才有效。
好吧,让我试着整理一下这里提到的所有内容。
您的第一个主要问题是您希望您的变量以某种方式运行,但您没有正确处理它们。那是因为你没有正确使用它们的作用域。
简单地说,变量的作用域就是可用的位置和可用的时间"live"。比如你的变量a, b, c, d, e, f
的作用域就是整个classLinearEquaions
。这意味着所有这些变量都应该对 class 的所有成员函数可用,并且只要包含它们的对象存在就会一直存在。该对象之外的任何东西都不应该 直接 访问这些变量。一旦一个对象死亡,它就会杀死它的所有私有变量。
每次在花括号 {}
中编写代码时,您都会定义一个 新范围 。它也被称为'code blocks'。在处理范围和大括号时要记住的一个重要规则是每个嵌套范围(在大多数情况下)都可以访问在其包含对象中定义的变量和函数。这就是为什么 class 的所有函数,基本上是在 class' {}
中编写的代码,都可以访问其包含的 class 的私有变量。此外,定义每个函数的代码是,猜猜是什么?在函数的 {}
内,因此每个函数都有自己的作用域。
这仍然不能直接解释为什么您的代码不起作用。让我们来看看你的一个功能。为了演示范围,我包含了 class 和变量声明:
public class LinearEquations {
Scanner input = new Scanner(System.in);
private double a, b, c, d, e, f = 0;
double x, y;
public double getA() {
System.out.println("Enter the value of a: ");
double a = input.nextDouble();
return a;
}
.
.
.
}//end of class LinearEquations, and its scope
看看 class 的范围,注意它是如何包含其中编写的所有代码的。现在,注意定义函数 getA()
的代码块。在函数之外,您可以按如下方式定义变量:
private double a, b, c, d, e, f = 0;
在这里,你说:我希望所有这些在我的 class 中的任何地方都可用,但只对 this
class 的成员可用,它们都是双精度类型,并且等于 0.
接下来,
public double getA() {
System.out.println("Enter the value of a: ");
double a = input.nextDouble();
return a;
}
double a = input.nextDouble();
行定义了一个new变量,叫做a
,在函数范围内,与变量[=22没有任何关系=] 你的 class。发生这种情况是因为您可以在不同范围内拥有相似名称的变量。这是您的代码的第一期。你丢失了值,因为你没有做工作并将它保存在你的 class 变量中,而是将它保存在一个临时变量中,该变量将在函数完成执行后立即消失,并且 return 它(它确实显然不等于保存它。
要解决这个问题,正如 mohmicro 所建议的,您应该使用 this
关键字来指定您希望编译器更新哪个变量。换句话说,当使用 this.a = input.nextDouble();
而不是 double a = input.nextDouble();
时,您是在说:将我刚刚所做的工作保存到 class' a
变量,而不是函数的 a
变量。同样的过程应该应用于你所有的 getB/C...F 函数,并确保你从用户那里得到的值存储在 class 中,这反过来又允许 isSolvable()
、getX()
和 getY()
以访问具有实际信息的变量(因为在您当前的实现中,a, b, c, d, e, f
保持为 0)。
回答你的第二个问题,你的每个函数都完成了不止一项任务。一般来说,这被认为是不好的做法,会导致函数不内聚。虽然它 可能 看起来更有效率或使用更少的代码行,但它会在尝试阅读代码以进行维护或调试时增加混乱。为什么?因为当它有多个功能时,或者当它不是一个功能一个目的的问题时,你可能会忽略一些功能的目的。
这也是你问题的根源。每次你想要获取任何一个变量的值 a,...,f
,你都与用户进行对话,并让他更改变量的值。这是因为你的函数做了两件事,它设置了一个值并 returns 它。非常不受欢迎。为了解决这个问题,你想要分而治之。您的每个 get 函数都应分为两个不同的函数。一个用用户的值设置变量,另一个在需要时获取该值。这是一个例子:
public void setA() {
System.out.println("Enter the value of a: ");
this.a = input.nextDouble(); //get the value from the user and insert it to the object's variable a
}
public double getA() {
return a;
}
这样,每当您需要用户为变量 a
提供新值时,您调用 setA()
,而每当您需要获取 a
中的内容时,您调用getA()
。一功能一用途。
如何打印出点 a-f 的值,而不是让它重复每次输入的内容?我的程序 returns 方程每次也无解,我做错了什么?
public class LinearEquations {
Scanner input = new Scanner(System.in);
private double a, b, c, d, e, f = 0;
double x, y;
public double getA() {
System.out.println("Enter the value of a: ");
double a = input.nextDouble();
return a;
}
public double getB() {
System.out.println("Enter the value of b: ");
double b = input.nextDouble();
return b;
}
public double getC() {
System.out.println("Enter the value of c: ");
double c = input.nextDouble();
return c;
}
public double getD() {
System.out.println("Enter the value of d: ");
double d = input.nextDouble();
return d;
}
public double getE() {
System.out.println("Enter the value of e: ");
double e = input.nextDouble();
return e;
}
public double getF() {
System.out.println("Enter the value of f: ");
double f = input.nextDouble();
return f;
}
public boolean isSolvable() {
if ((a * d) - (b * c) == 0){
return false;
}
return true;
}
public double getX() {
double x = (((e * d) - (b * f)) / ((a * d) - (b * c)));
return x;
}
public double getY() {
double y = (((a * f) - (e * c)) / ((a * d) - (b * c)));
return y;
}
这是主要的class
public static void main(String[] args) {
LinearEquations pointA = new LinearEquations();
LinearEquations pointB = new LinearEquations();
LinearEquations pointC = new LinearEquations();
LinearEquations pointD = new LinearEquations();
LinearEquations pointE = new LinearEquations();
LinearEquations pointF = new LinearEquations();
System.out.println(pointA.getA());
System.out.println(pointB.getB());
System.out.println(pointC.getC());
System.out.println(pointD.getD());
System.out.println(pointE.getE());
System.out.println(pointF.getF());
LinearEquations pointX = new LinearEquations();
LinearEquations pointY = new LinearEquations();
if (pointX.isSolvable() && pointY.isSolvable()) {
System.out.println("x is " + pointX.getX() +
" and y is " + pointY.getY());
} else {
System.out.println("The equation has no solution");
}
您的逻辑有一些问题,您在创建 8 LinearEquation 对象时实际上只需要 1。
public static void main(String[] args) {
LinearEquations theOne = new LinearEquations();
System.out.println(theOne.getA());
System.out.println(theOne.getB());
System.out.println(theOne.getC());
System.out.println(theOne.getD());
System.out.println(theOne.getE());
System.out.println(theOne.getF());
if (theOne.isSolvable()) {
System.out.println("x is " + theOne.getX() +
" and y is " + theOne.getY());
} else {
System.out.println("The equation has no solution");
}
}
在您的方法中,您没有将数据写入 class 成员。您只需在函数内部重新定义一个局部变量并将值写入它即可。 在你的代码中
public double getF() {
System.out.println("Enter the value of f: ");
double f = input.nextDouble();
return f;
}
应该是
public double getF() {
System.out.println("Enter the value of f: ");
this.f = input.nextDouble();
return f;
}
这就在你身边,你有许多对象,每个对象都有一个输入值。您应该只使用具有所有值的一个,这样方程式才有效。
好吧,让我试着整理一下这里提到的所有内容。
您的第一个主要问题是您希望您的变量以某种方式运行,但您没有正确处理它们。那是因为你没有正确使用它们的作用域。
简单地说,变量的作用域就是可用的位置和可用的时间"live"。比如你的变量a, b, c, d, e, f
的作用域就是整个classLinearEquaions
。这意味着所有这些变量都应该对 class 的所有成员函数可用,并且只要包含它们的对象存在就会一直存在。该对象之外的任何东西都不应该 直接 访问这些变量。一旦一个对象死亡,它就会杀死它的所有私有变量。
每次在花括号 {}
中编写代码时,您都会定义一个 新范围 。它也被称为'code blocks'。在处理范围和大括号时要记住的一个重要规则是每个嵌套范围(在大多数情况下)都可以访问在其包含对象中定义的变量和函数。这就是为什么 class 的所有函数,基本上是在 class' {}
中编写的代码,都可以访问其包含的 class 的私有变量。此外,定义每个函数的代码是,猜猜是什么?在函数的 {}
内,因此每个函数都有自己的作用域。
这仍然不能直接解释为什么您的代码不起作用。让我们来看看你的一个功能。为了演示范围,我包含了 class 和变量声明:
public class LinearEquations {
Scanner input = new Scanner(System.in);
private double a, b, c, d, e, f = 0;
double x, y;
public double getA() {
System.out.println("Enter the value of a: ");
double a = input.nextDouble();
return a;
}
.
.
.
}//end of class LinearEquations, and its scope
看看 class 的范围,注意它是如何包含其中编写的所有代码的。现在,注意定义函数 getA()
的代码块。在函数之外,您可以按如下方式定义变量:
private double a, b, c, d, e, f = 0;
在这里,你说:我希望所有这些在我的 class 中的任何地方都可用,但只对 this
class 的成员可用,它们都是双精度类型,并且等于 0.
接下来,
public double getA() {
System.out.println("Enter the value of a: ");
double a = input.nextDouble();
return a;
}
double a = input.nextDouble();
行定义了一个new变量,叫做a
,在函数范围内,与变量[=22没有任何关系=] 你的 class。发生这种情况是因为您可以在不同范围内拥有相似名称的变量。这是您的代码的第一期。你丢失了值,因为你没有做工作并将它保存在你的 class 变量中,而是将它保存在一个临时变量中,该变量将在函数完成执行后立即消失,并且 return 它(它确实显然不等于保存它。
要解决这个问题,正如 mohmicro 所建议的,您应该使用 this
关键字来指定您希望编译器更新哪个变量。换句话说,当使用 this.a = input.nextDouble();
而不是 double a = input.nextDouble();
时,您是在说:将我刚刚所做的工作保存到 class' a
变量,而不是函数的 a
变量。同样的过程应该应用于你所有的 getB/C...F 函数,并确保你从用户那里得到的值存储在 class 中,这反过来又允许 isSolvable()
、getX()
和 getY()
以访问具有实际信息的变量(因为在您当前的实现中,a, b, c, d, e, f
保持为 0)。
回答你的第二个问题,你的每个函数都完成了不止一项任务。一般来说,这被认为是不好的做法,会导致函数不内聚。虽然它 可能 看起来更有效率或使用更少的代码行,但它会在尝试阅读代码以进行维护或调试时增加混乱。为什么?因为当它有多个功能时,或者当它不是一个功能一个目的的问题时,你可能会忽略一些功能的目的。
这也是你问题的根源。每次你想要获取任何一个变量的值 a,...,f
,你都与用户进行对话,并让他更改变量的值。这是因为你的函数做了两件事,它设置了一个值并 returns 它。非常不受欢迎。为了解决这个问题,你想要分而治之。您的每个 get 函数都应分为两个不同的函数。一个用用户的值设置变量,另一个在需要时获取该值。这是一个例子:
public void setA() {
System.out.println("Enter the value of a: ");
this.a = input.nextDouble(); //get the value from the user and insert it to the object's variable a
}
public double getA() {
return a;
}
这样,每当您需要用户为变量 a
提供新值时,您调用 setA()
,而每当您需要获取 a
中的内容时,您调用getA()
。一功能一用途。