Передача значений в класс дроби в java

Если бы я должен был создать новую программу и хотел бы иметь класс дроби и то, что моя книга называет классом драйвера, который является основным классом, и у меня есть такой код

// Driver class

import java.util.Scanner;

public class DriverClass{

    public static void main(String[] args){

        Scanner stdIn = new Scanner(System.in);
        Fraction c, d;

        System.out.println(" Enter a numerator then a denominator:");
        c = new Fraction( stdIn.nextInt(), stdIn.nextInt());
        c.print();

       System.out.println(" Enter a numerator then a denominator:");
        d = new Fraction( stdIn.nextInt(), stdIn.nextInt());
        d.print();
    }
}
...

в моем классе фракций у меня есть метод, называемый публичной фракцией. Как это установит оба числа из дроби c в классе драйвера, который поступает из утилиты сканера, а также будут ли значения c заменены значениями, поступающими из дроби d? Я беру курс Java, и это часть моей домашней работы, которую я не понимаю. Я пытаюсь передать эти значения классу дробей, потому что в конце концов мне нужно сложить эти две дроби вместе, а также умножить их.

// begining of class

public class Fraction{

    private int numerator;
    private int denominator;

    // well this is what my problem is, how do I call for c 
    // twice in the Fraction class
    public int Fraction(int num, int denom){

this.numerator = num;

this.denominator = denom;
}
    // is this the right way to recieve the fraction 
    // from the driver class for both c and d?

}

может ли кто-нибудь помочь мне с этим


person daddycardona    schedule 03.10.2009    source источник
comment
почему ты не отредактировал свой старый пост? Я написал ответ...   -  person Martijn Courteaux    schedule 03.10.2009
comment
Возможно, я испортил некоторые правки, когда форматировал код; это было непреднамеренно. Извинения. К вашему сведению: подробности о том, как размещать код в Markdown здесь: stackoverflow.com/editing-help   -  person McDowell    schedule 03.10.2009
comment
Извините, я пытался отредактировать свой старый пост, потому что многие люди меня не поняли, и я пытался помочь им понять меня, а я нахожусь на правительственном компьютере, поэтому на этом сайте мне многое было непонятно. Я пытаюсь написать программу для школы, но я не очень ее понимаю. Я сейчас на дежурстве, поэтому делаю тысячу дел одновременно.   -  person daddycardona    schedule 03.10.2009


Ответы (1)


Ваш метод Fraction — это метод, который определен для возврата целого числа, но вы вызываете его, как если бы он был конструктором.

Конструкторы ничего не возвращают, поэтому не объявляйте возвращаемый тип. ( у них даже нет типа void, поэтому компилятор знает, что они являются конструкторами, а не методами, и их нужно вызывать с помощью new. Это небольшая ошибка, что Java позволяет вам объявлять методы с тем же именем, что и класс, IIRC один из головоломки в Java Puzzlers делают это).

Удалите возвращаемый тип "int" из определения:

public class Fraction{

    private int numerator;
    private int denominator;

    public  Fraction(int num, int denom) {
        //...

Как это установит оба числа из дроби c в классе драйвера, который поступает из утилиты сканера, а также будут ли значения c заменены значениями, поступающими из дроби d?

Вы делаете два звонка new Fraction(..,..). Каждый раз, когда вы используете new, он создает новый объект запрошенного класса, а затем вызывает конструктор этого объекта с заданными вами значениями. Таким образом, c и d будут содержать ссылки на разные экземпляры Fraction. Поскольку поля numerator и denominator в Fraction не помечены как static, то каждый экземпляр Fraction будет иметь свою собственную копию этих полей, поэтому значения, переданные конструктору объекта, ссылка на который будет храниться в переменной c, сохраняются в первого нового объекта и d во втором новом объекте. Поскольку это разные объекты, значения не заменяют друг друга.

person Pete Kirkham    schedule 03.10.2009
comment
Конструкторы ничего не возвращают? Даже не экземпляр типа, определенного классом? - person Dexygen; 03.10.2009
comment
Нет. Экземпляр выделяется, затем дублируется в стеке, после чего вызывается конструктор (переименованный в ‹init›). Вы когда-нибудь видели конструктор, который заканчивается оператором return? - person Pete Kirkham; 03.10.2009
comment
Я очень новичок в Java и немного изучил vb и c++ в свое время. Как в 98, но я не помню этого, и я немного запутался в этом проекте, которым я занимаюсь. - person daddycardona; 03.10.2009
comment
Что произойдет, если мне нужно будет сложить эти две дроби вместе, а затем распечатать их. - person daddycardona; 03.10.2009
comment
Вам нужно будет создать метод plus(), который возвращает новую дробь, представляющую сумму двух дробей. Вам также понадобится метод toString(), который преобразует дробь в строку, а затем вы можете вызвать System.out.println(c.plus(d)) - person Pete Kirkham; 03.10.2009
comment
Пит, то, что вы сказали в первых комментариях, помогло мне снова понять, что c и d - это новые объекты, занимающие свое место, и хотя в моей книге это тоже говорится, я все еще немного запутался. Я просто хочу сказать большое спасибо, мне это было нужно. - person daddycardona; 03.10.2009
comment
Как бы вы добавили числители и знаменатели в оператор плюс, я пытался сделать add () int x = this.numerator (c) + this.numerator (d), я не понимаю. - person daddycardona; 03.10.2009
comment
Задайте новый вопрос и опубликуйте код, над которым вы работаете, вместо того, чтобы использовать комментарии к этому. - person Pete Kirkham; 03.10.2009