[英]Concerning multiple constructors in Java
我有一个关于Java中构造函数的多个实例的问题。
我的任务是接收两个分数,然后将这些分数相乘并除。
我不确定如何为类对象本身的实例设置单独的值。
这是我遇到问题的示例代码:
import java.util.Scanner;
public class TextLab05
{
static int num1, den1; // numerator and denominator of the 1st rational number
static int num2, den2; // numerator and denominator of the 2nd rational number
public static void main (String args[])
{
enterData();
Rational r1 = new Rational(num1,den1);
Rational r2 = new Rational(num2,den2);
}
}
class Rational
{
private int firstNum; // entered numerator
private int firstDen; // entered denominator
private int num; // reduced numerator
private int den; // reduced denominator
public Rational()
{
}
public Rational(int n, int d)
{
n = TextLab05.num1;
d = TextLab05.den1;
//Here specifically is where I am having comprehension issues. How can I include num2 and den2 if I only have int n and int d?
}
}
如果很难从上下文中理解这一点,那么这里给出了我的整个起始代码:
import java.util.Scanner;
public class TextLab05
{
static int num1, den1; // numerator and denominator of the 1st rational number
static int num2, den2; // numerator and denominator of the 2nd rational number
public static void main (String args[])
{
enterData();
Rational r1 = new Rational(num1,den1);
Rational r2 = new Rational(num2,den2);
Rational r3 = new Rational();
r3.multiply(r1,r2);
System.out.println("\n\n" + r1.getOriginal() + " * " + r2.getOriginal() + " = " + r3.getRational());
r3.divide(r1,r2);
System.out.println("\n" + r1.getOriginal() + " / " + r2.getOriginal() + " = " + r3.getRational());
// 100 Point Version Only
// r3.add(r1,r2);
// System.out.println("\n" + r1.getOriginal() + " + " + r2.getOriginal() + " = " + r3.getRational());
// r3.subtract(r1,r2);
// System.out.println("\n" + r1.getOriginal() + " - " + r2.getOriginal() + " = " + r3.getRational());
System.out.println();
}
public static void enterData()
{
Scanner input = new Scanner(System.in);
System.out.print("\nEnter the 1st numerator ----> ");
num1 = input.nextInt();
System.out.print("\nEnter the 1st denominator --> ");
den1 = input.nextInt();
System.out.print("\nEnter the 2nd numerator ----> ");
num2 = input.nextInt();
System.out.print("\nEnter the 2nd denominator --> ");
den2 = input.nextInt();
}
}
class Rational
{
private int firstNum; // entered numerator
private int firstDen; // entered denominator
private int num; // reduced numerator
private int den; // reduced denominator
public Rational()
{
}
public Rational(int n, int d)
{
n = TextLab05.num1;
d = TextLab05.den1;
}
private int getGCF(int n1,int n2)
{
int rem = 0;
int gcf = 0;
do
{
rem = n1 % n2;
if (rem == 0)
gcf = n2;
else
{
n1 = n2;
n2 = rem;
}
}
while (rem != 0);
return gcf;
}
public int getNum()
{
return TextLab05.num1;
}
public int getDen()
{
return TextLab05.den1;
}
public double getDecimal()
{
return (double)TextLab05.num1 / TextLab05.den1;
}
public String getRational()
{
String rational = "" + TextLab05.num1 + "/" + TextLab05.den1;
return rational;
}
public String getOriginal()
{
String original = "" + TextLab05.num1 + "/" + TextLab05.den1;
return original;
}
public void reduce()
{
}
public void multiply(Rational r1, Rational r2)
{
}
public void divide(Rational r1, Rational r2)
{
}
public void add(Rational r1, Rational r2)
{
}
public void subtract(Rational r1, Rational r2)
{
}
}
你打电话时:
Rational r1 = new Rational(num1, den1);
Rational r2 = new Rational(num2, den2);
在程序的主方法中,您将创建两个Rational类的实例,一个实例名为r1,另一个实例名为r2。 因为要将int值传递给Rational构造函数,所以将被调用的构造函数是需要两个整数参数的构造函数:
public Rational(int n, int d)
{
...
}
编译器之所以知道这一点,是因为它与构造函数的名称以及传递的参数的类型匹配(称为与构造函数的“签名”匹配)。
在您提供的代码中,Rational Constructor代码实际上没有意义-此代码:
public Rational(int n, int d)
{
n = TextLab05.num1;
d = TextLab05.den1;
}
应该看起来像这样:
public Rational(int n, int d)
{
this.firstNum = n;
this.firstDen = d;
}
然后将值n和d传递给构造函数,然后在构造函数的主体中,实例变量firstNum和firstDen(在Rational类的私有部分中声明,并有效地“属于”正在创建的实例)初始化为n和d的值。
在Rational类的主体内的任何地方,您都应该引用成员变量firstNum
和firstDen
,而不是不属于该类实例的变量。
我假设Rational
类应该表示一个有理数。 你说:
//Here specifically is where I am having comprehension issues. How can I include num2 and den2 if I only have int n and int d?
您不需要在Rational
类中存储两个分子和两个分母。 您只需要创建两个Rational
对象。 一个用于存储num1
和den1
,另一个用于存储num2
和den2
。 您已经在执行此操作:
Rational r1 = new Rational(num1,den1);
Rational r2 = new Rational(num2,den2);
在Rational
存储两个分子和两个分母是没有意义的。 一个有理数只有一个。
总结: r1
存储num1
和den1
,而r2
存储另外两个。 创建新的Rational
, n
和d
指的是您要创建的特定实例的分子和分母。
我不确定您对Rational的实现是否是您想要的,但是构造函数并不限于本地变量,它可以访问它可以访问的其他类中的任何静态变量。
public Rational(int n, int d)
{
n = TextLab05.num1;
d = TextLab05.den1;
}
n
和d
是局部变量, num1
和den1
是类TextLab05
中的静态变量。
因此,您要为局部变量分配来自其他类的静态值。
代码没有意义,因为在将值分配给在方法结束时释放的局部变量之后,您无需对值进行任何处理。
最重要的事情是理解概念。 您将在您的Rational
类中存储一个有理数。 执行此操作时:
Rational r1 = new Rational(num1,den1);
您正在创建Rational
的单个实例并将其命名为r1。 r1
现在应该包含一个分子和一个分母(在本例中为num1
和den1
)。
假设您要将数字设为一半或1/2。 您可以这样做:
Rational oneHalf = new Rational(1,2);
意识到new Rational(1,2)
正在调用您的Rational
类的构造函数。 在构造函数中,您需要将num
和den
分配给传递的值(在本例中为1和2)。 因此,您将需要以下内容:
this.num = num1;
this.den = den1;
因此,如果您希望能够将一个Rational
与另一个Rational
相乘,则需要一种方法或函数来做到这一点。 在您的Rational
类中,创建一个称为multiply(Rational anotherRational)
。
该函数将执行以下操作:
this.num = this.num * anotherRational.num;
this.den = this.den * anotherRational.den;
我给了一半答案,剩下的我让你做。 不要只是复制您在这里找到的内容,请考虑您在做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.