#java #class #import
#java #класс #импорт
Вопрос:
Должен ли я импортировать класс Java, если класс, который я импортирую, находится в том же пакете, что и класс, в который я импортирую (я пытаюсь расширить первый класс, оба SavingsAccount и SpecialSavings находятся в одной учетной записи)? Также я пытаюсь получить доступ к частной переменной в моем родительском классе из подкласса, но это мне не позволяет. Вот мой код:
package finance;
import finance.SavingsAccount;
public class SpecialSavings extends SavingsAccount
{
public SpecialSavings(double savingsBalance)
{
super.setBalance(savingsBalance);
}
if (super.getBalance() > 10000)
{
modifyInterestRate(10);
}
}
Вот код для SavingsAccount:
package finance;
public class SavingsAccount
{
private static double annualInterestRate;
private double savingsBalance;//indicates the amount the saver currently has on deposit
public SavingsAccount(double savingsBalance)//default constructor
{
this.savingsBalance = savingsBalance;
}
public double calculateMonthlyInterest()
{
savingsBalance = savingsBalance * ((annualInterestRate/100)/12);
return savingsBalance;
}
public static void modifyInterestRate(double newValue)
{
annualInterestRate = newValue;
}
/*-------------getters and setters------------------------*/
public void setBalance(double newValue)
{
savingsBalance = newValue;
}
public double getBalance()
{
return savingsBalance;
}
}
Комментарии:
1. покажите код для
SavingsAccount
, также этоhomework
, если да, добавьте его в качестве тега.
Ответ №1:
- Вам не нужно импортировать классы из одного и того же пакета.
- Вы не можете получить доступ к частной переменной класса из другого класса (если только это не внутренний класс) Если вы хотите, чтобы переменная была видимой для подклассов, используйте
protected
, а неprivate
.
Кроме того, вы пытаетесь вызвать super.getBalance()
вне любого блока, что незаконно, вы должны переместить его в какой-нибудь ваш метод. Для примера:
public void modify()
{
if (super.getBalance() > 10000)
{
modifyInterestRate(10);
}
}
Комментарии:
1. я использую общедоступные методы получения? разве вы не можете этого сделать?
2. Вы можете сделать это с помощью методов получения, но не напрямую. если
x
является закрытым членомsomeclass
, то —someclass.getX()
нормально.someclass.x
это не так.3. следующая спецификация уже сделала метод родительских классов закрытым, поэтому я не могу его изменить. итак, я использую методы получения и установки, как вы можете видеть в приведенном выше коде
4. итак, eclipse выдает мне это сообщение об ошибке. «Неявный суперконструктор SavingsAccount() не определен. Необходимо явно вызвать другой конструктор»
5. Это другая проблема. И вместо того, чтобы писать это в комментарии — прочитайте это: particle.kth.se /~lindsey/JavaCourse/Book/Часть 1 /Java/Глава 04/…
Ответ №2:
Нет. Все классы в вашем пространстве имен видны и могут использоваться без их явного импорта.
Ответ №3:
Для доступа к super class
переменным создайте protected
, но лучшим решением является создание protected setter/getters
для этого private
экземпляра переменной и использование их вместо нее.
Ответ №4:
Существуют 3 access modifier
- Частное
- Защищенный
- Открытый
И 4 access control
- Частное
- По умолчанию
- Защищенный 4 общедоступный
Поскольку вы находитесь в том же пакете, нет НЕОБХОДИМОСТИ ИМПОРТИРОВАТЬ.
И так как вы хотите получить доступ к закрытому члену родительского класса из его подкласса, это незаконно. ………. Если этот подкласс находится в том же пакете, вы можете создать элемент родительского класса, к которому вы хотите получить доступ по умолчанию (т. Е. не писать никаких модификаторов доступа), или если подкласс находится за пределами родительского пакета, тогда используйте protected или public.