#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
? Что вы используете для сборки и запуска этого кода?