Относительно нескольких конструкторов в Java

1

У меня вопрос о нескольких экземплярах конструктора в 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)
    {

    }
}
Теги:
constructor

4 ответа

5
Лучший ответ

Когда вы звоните:

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, а не на переменные, которые не относятся к экземпляру класса.

  • 0
    Спасибо! Это исправило мой код и моё понимание.
1

Я не уверен, что ваша реализация Rational - это то, что вы намереваетесь, но конструктор не ограничивается локальными переменными, он может обращаться к любым статическим переменным из других классов, к которым он может получить доступ.

public Rational(int n, int d)
{
    n = TextLab05.num1;
    d = TextLab05.den1;
}

n и d являются локальными переменными, num1 и den1 статические переменные в классе TextLab05.

Таким образом, вы назначаете локальные переменные статическими значениями из другого класса.

Код не имеет смысла, поскольку вы ничего не делаете со значениями после назначения их локальным переменным, которые удаляются при завершении метода.

1

Я предполагаю, что класс 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 ссылаются на числитель и знаменатель этого конкретного экземпляра, который вы создаете.

0

Самое главное - понять концепцию. Вы собираетесь хранить рациональное число в своем классе 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;

Я отдал половину ответа, я позволю тебе сделать все остальное. Не просто скопируйте то, что вы найдете здесь, подумайте о том, что вы делаете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню