Начал изучать программирование и начал с языка Java и столкнулся с трудностью, поэтому прошу помощи.
Объясните пожалуйста про return
более подробно. Почему в примере кода return
используется только в случае с amountToWithdraw
, и почему его не используют также в случае с amountToDeposit?
Пример кода:
public class SavingsAccount {
int balance;
public SavingsAccount(int initialBalance){
balance = initialBalance;
}
public void checkBalance(){
System.out.println("Hello!");
System.out.println("Your balance is "+balance);
}
public void deposit(int amountToDeposit){
balance = balance + amountToDeposit;
System.out.println("You just deposited "+amountToDeposit);
}
public int withdraw(int amountToWithdraw){
balance = balance - amountToWithdraw;
System.out.println("You just withdrew "+amountToWithdraw);
return amountToWithdraw;
}
public String toString(){
return "This is a savings account with " + balance + " saved.";
}
public static void main(String[] args){
SavingsAccount savings = new SavingsAccount(2000);
savings.checkBalance();
savings.withdraw(300);
savings.checkBalance();
savings.deposit(600);
savings.checkBalance();
savings.deposit(600);
savings.checkBalance();
System.out.println(savings);
}
}
Методы, в зависимости от того, что нужно автору программы, могут возвращать значение того или иного типа, а могут не возвращать никакого значения. Те, которые вычисляют и возвращают какое-то значение, по смыслу соответствуют математическому понятию функции (типа у = sin(x)
), и в некоторых языках так и называются -- функции
. Те, которые просто совершают какие-то действия, но не возвращают никакого значения, по смыслу соответствуют тому, что в других языках называется процедуры
. Методы первого типа в Java
описываются с указанием типа результата и обязаны явно использовать как минимум один оператор return
с указанием возвращаемого значения, причем компилятор проверяет, что тот или иной из этих операторов выполнится неизбежно, при любых обстоятельствах (кроме случаев возникновения исключений). Ведь внутри тела метода могут вычисляться несколько разных значений, а компилятор должен знать, какое именно из них должно являться результатом вычисления функции. Например:
public double sqrtOfSinMultByCos(double a, double b) {
double sin = Math.sin(a);
double cos = Math.cos(b);
return Math.sqrt(sin * cos);
}
public int badMethod(int a) { // Не откомпилируется,
// сругается "This method must return a result of type int"
if (a >= 10) {
return a / 10; // оператор return есть,
// но его выполнение не гарантировано:
} else { // В этом случае return не выполнился бы
System.out.println("a меньше 10");
}
}
Методы второго типа, которые просто выполняют какие-то действия и не возвращают никакого значения, описываются с ключевым словом void
, которое используется вместо указания типа результата, и не обязаны, но могут иметь явный оператор return
. Например:
public void printSqrtOfSinMultByCos(double a, double b) {
double sin = Math.sin(a);
double cos = Math.cos(b);
System.out.println(Math.sqrt(sin * cos));
}
В норме код такого метода выполняется до конца, затем происходит возврат к выполнению того участка кода, который следует за вызовом метода. Если по логике метода код метода не обязан выполняться весь, то можно использовать оператор return
в нескольких местах кода, не обязательно в конце. Это может упростить структуру кода и улучшить его читаемость:
// Найти макс. x, x <= 10, на которое делится n
publiс void reportDivisibility(int n) {
if (n % 10 == 0) {
System.out.println("n делится на 10"); return;
}
// Если n делится на 10, другие условия не проверяются
// TODO Добавить проверку других признаков делимости
if (n % 3 == 0) {
System.out.println("n делится на 3"); return;
}
if (n % 2 == 0) {
System.out.println("n -- четное"); return;
}
System.out.println("n не делится на числа 2..10";
}
Этот же прием можно использовать и в методах, возвращающих результат:
public BigDecimal max(BigDecimal a, BigDecimal b) {
if (a.compareTo(b) > 0)
return a;
return b;
}
Здесь return b
выполняется только в том случае, если не выполнилось условие оператора if
и соответственно не выполнилось return a;
.
Зависит от возвращаемого типа метода к которому вы обращаетесь. В вашем случае возвращаемым типом метода public int withdraw(int amountToWithdraw)
является тип int
, соответственно метод должен иметь точку выхода со значением типа int
. Для метода public String toString()
это return "This is a savings account with " + balance + " saved.";
у которого тип String
и.т.д.
А метод public void checkBalance()
помечен как void
и не возвращает ничего. Можно преждевременно прекратить выполнение вызвав пустой return;
https://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html
Просто потому что автору взбрело в голову так написать.
Эти методы по сути одинаковые и логично чтобы они либо оба ничего не возвращали, либо чтобы оба что-то возвращали. При этом возврат аргументы видится мне действием совершенно бесполезным и если уж что-то возвращать, то значение balance
.
Кстати, ещё охапка косяков этого кода:
balance
можно получить только как часть строки после toString()
- никакого геттера не предусмотрено.main()
, являющийся стартовой точкой программы. Во-первых, это уже так себе стиль, во-вторых, такое расположение позволит обращаться из него в приватным полям.Если это код из учебника, и в нём не поясняется, что что-то сделано для примера и ничего не говорится о существовании недостатков (которые будут исправляться в дальнейшем), я бы рекомендовал его сменить.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Ребят, очень нужноКак сделать так, чтобы при нажатии на кнопку всплывала форма с с полями, куда пользователь мог бы внести данные и тем самым...
Здраствуйте, у меня появилась проблема - Uncaught TypeError: Cannot read property 'style' of null