Как я могу отобразить переменную из другого класса без использования методов получения и настройки?

#java

#java

Вопрос:

Я студент первого курса, и я действительно испытываю трудности здесь. Это один из вопросов, которые я должен задать для своего назначения (мне разрешено использовать StackOverflow для руководства).

Создайте класс с именем Customer , который будет определять ежемесячную сумму погашения, причитающуюся клиенту за продукт, купленный в кредит. Класс имеет пять полей: customer name , contact number , product price , number of months the monthly repayment amount и,,.

Напишите методы get и set для каждого поля, за исключением поля сумма ежемесячного погашения. Методы set должны предлагать пользователю ввести значения для следующих полей: customer name , contact number , product price и number of months .

Этому классу также нужен метод для вычисления суммы ежемесячного погашения (цена продукта, деленная на количество месяцев).

Добавьте подкласс с именем Finance_Period , который будет определять, будет ли клиент выплачивать проценты или нет.

Если количество месяцев для оплаты продукта больше трех, клиент заплатит 25% процентов, иначе проценты не применяются.

Максимальное количество месяцев для оплаты продукта равно 12.

Переопределите calculate_repayment() метод, определив, будет ли клиент выплачивать проценты или нет, и рассчитайте сумму ежемесячного погашения.

Создайте класс с именем Customer_Finance , который содержит логику для тестирования двух классов.

Запрашивать у пользователя данные для первого объекта, к которому не применяется интерес, и отображать результаты; затем запрашивать у пользователя данные, к которым применим интерес, и отображать результаты.

Я изо всех сил пытаюсь вызвать amtRepay в свой main без использования getters и setters .

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

Кроме того, у меня есть другой класс с именем Finace_Period , там пока ничего нет, я пока не уверен на 100% в том, что я делаю.

Это мой основной класс, в котором я хочу отобразить amtRepay .

 package main;

import javax.swing.JOptionPane;


public class Main {

    
    public static void main(String[] args) {
        //Variables
        String name;
        int cNumber, months;
        double price;
        
        //Input
        name = JOptionPane.showInputDialog(null, "Please enter the customer's name:");
        cNumber = Integer.parseInt(JOptionPane.showInputDialog(null, "Please enter the customer's contact number:"));
        price = Double.parseDouble(JOptionPane.showInputDialog(null, "Please enter the price of the product:"));
        months = Integer.parseInt(JOptionPane.showInputDialog(null, "Please enter the number of repayment months:"));
        
        Customer c = new Customer(name, cNumber, months, price);
        
        JOptionPane.showMessageDialog(null, c.calcaAmtRepay());
                  
        }
    
    }
  

и это мой вторичный класс, где amtRepay вычисляется.

 package Main;

public class Customer extends Finance_Period {
    
    //Atributes
    private String name;
    private int cNumber, months;
    private double price, amtRepay;
    
    //Constructors
    public Customer (String name, int cNumber, int months, double price) {
        this.name = name;
        this.cNumber = cNumber;
        this.months = months;
        this.price = price;
       
        
    }

    //Getters
    public String getName() {
        return name;
    }

    public int getcNumber() {
        return cNumber;
    }
    
    public int getMonths() {
        return months;
    }
    
     public double getPrice() {
        return price;
    }
     
    //Setter
    public void setName(String name) {
        this.name = name;
    }

    public void setcNumber(int cNumber) {
        this.cNumber = cNumber;
    }

    public void setMonths(int months) {
        this.months = months;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    //Calculation of monthly repayments
    public double calcAmtRepay () {
       
        amtRepay = price / months;
        
        return price / months;
    }
}
  

Спасибо.

Комментарии:

1. каков ваш вывод из вашего основного класса?

2. Исключение в потоке «main» java.lang.RuntimeException: Некомпилируемый исходный код — Ошибочный тип дерева: main.Customer в main.Main.main(Main.java:25) Это просто выдает мне эту ошибку, когда дело доходит до вывода amtRepay @jaSnom

3. Прежде всего, я думаю, что вам нужно определить другой конструктор, поскольку ваш конструктор по умолчанию ожидает AmtRepay, который вы не передаете. поэтому вы могли бы определить новый конструктор, который содержит только передаваемые вами параметры: public Customer (String name, int cNumber, int months, double price) { this.name = name; this.cNumber = cNumber; this.months = months; this.price = price; }

4. Также к частным переменным нельзя получить прямой доступ. Вам нужно сделать их либо общедоступными, либо определить геттер. В этом случае было бы достаточно геттера, поскольку вы не хотите изменять его из внешнего, если я прав.

5. Хорошо, но я не могу использовать методы получения и настройки? Я удалил amtRepay из своего конструктора.

Ответ №1:

Измените свой конструктор: оставьте аргумент amtRepay.

 //Constructors
public Customer (String name, int cNumber, int months, double price) {
    this.name = name;
    this.cNumber = cNumber;
    this.months = months;
    this.price = price;
}
  

Имейте в виду, что после вызова этого конструктора поле amtRepay все еще не вычисляется. Лучше: вам даже не нужно поле amtRepay в Customer, поскольку его значение вычисляется при каждом вызове calcAmtRepay() , что является хорошей идеей, потому что в противном случае вам придется пересчитывать его также в setMonths и setPrice .

 public double calcAmtRepay () {
    return price / months;    
}

JOptionPane.showMessageDialog(null, c.calcAmtRepay());
  

Комментарии:

1. что вы подразумеваете под «не работает»? В чем ошибка, которую вы получили? Ошибка компиляции, ошибка времени выполнения?

2. Исключение в потоке «main» java.lang.RuntimeException: Некомпилируемый исходный код — Ошибочный тип дерева: main.Customer в main.Main.main(Main.java:25) Вот что я получаю

Ответ №2:

В вашем классе main.Main вы ссылаетесь на class main.Customer , но в соответствии с опубликованным вами кодом у вас есть только class Main.Customer .

Измените package Main; на package main; в вашем Customer.java , и это должно сработать.

Редактировать:

У меня нет Netbeans, поэтому я использовал Visual Studio Code с установленными расширениями Java.

Я создал пустой каталог. Внутри этого каталога я создал файл build.xml и подкаталог src . Внутри src я создал пакет main и скопировал ваш код. Я также создал пустой класс main.Finance_Period .

Моя среда разработки уведомила меня, что у класса main.Customer есть метод calcAmtRepay() , но в классе, который main.Main вы вызываете calcaAmtRepay() , обратите внимание на дополнительный нижний регистр a между calc и Amt . Я исправил это, а затем добавил следующее в свой build.xml :

 <project name="MyProject" default="dist" basedir=".">
  <description>
    Java assignment build file
  </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist" location="dist"/>

  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init"
        description="compile the source">
    <!-- Compile the Java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution">
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>

    <!-- Put everything in ${build} into the java-assignment-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/lib/java-assignment-${DSTAMP}.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up">
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>
  

Затем я запустил ant dist в оболочке и, наконец, выполнил:

 java -cp dist/lib/java-assignment-20200901.jar main.Main
  

для запуска приложения.

Как компиляция, так и выполнение выполняются нормально.

Я использовал OpenJDK 11.0.8 2020-07-14.

Пожалуйста, дайте мне знать, если что-то из этого поможет.

Редактировать 2:

Я поместил рабочий код на GitLab. Вы можете игнорировать Dockerfile и ссылки на Docker, остальное я уже объяснил.

Комментарии:

1. Пожалуйста, добавьте код для Finance_Period к вашему вопросу.

2. Пока их нет, мне все еще нужно добраться до них

3. Для ясности — это пустой класс без каких-либо методов или полей или класс вообще не существует?

4. Класс есть но там нет ничего абсолютно ничего

5. Это в пакете main или Main ? Что вы используете для сборки и запуска этого кода?