Wracając do pierwszego pytania,
@Adam8877 da się tak w Javie i kod który podałeś powinien zadziałać.
1. Bez przekazania
Pełna wersja tego co napisałeś mogłaby wyglądać tak:
Kopiuj
class Main {
public static int month;
public static void main(String[] args) {
MyClass.changeMonth();
System.out.println(month); // wynik: 4
}
}
class MyClass {
public static void changeMonth() {
Main.month = 4;
}
}
W takim podejściu nie ma przekazywania, changeMonth nic nie otrzymuje, tylko sam sięga do Main i zmienia.
Gdy taki kod ci się rozrośnie, możesz być zdezorinetowany, jaki fragment, kiedy i dlaczego zmienia Main.month.
I wtedy możesz uznać, że lepiej będzie tę zmianę wyraźniej wyrazić w kodzie, przekazując month do changeMonth np.
2. Przekazanie przez wartość
Kopiuj
class Main {
public static void main(String[] args) {
int month = 0;
MyClass.changeMonth(month);
System.out.println(month); // wynik: 0
}
}
class MyClass {
public static void changeMonth(int month) {
month = 4;
}
}
Ta wersja nie zadziała jak byś chciał. Typy proste w Javie przekazywanie są przez wartość.
Month widoczny w ciele changeMonth to niezależna kopia month z main i zmiana nie będzie widoczna w main.
Natomiast przez referencję przekazywane są w Javie obiekty, stąd poniższa wersja zadziała ok.
3. Przekazanie przez referencję
Kopiuj
class Main {
public static void main(String[] args) {
var month = new MyInteger();
MyClass.changeMonth(month);
System.out.println(month.value); // wynik: 4
}
}
class MyInteger {
public int value;
}
class MyClass {
public static void changeMonth(MyInteger month) {
month.value = 4;
}
}
W praktyce zamiast MyInteger nazwiemy klasę inaczej, bliżej problemu i powiększymy o więcej pól...
Podsumowując:
Tak jak napisałeś się da, przy czym to jest bez przekazania.
I tak, w Javie jest przekazanie przez referencję (argumentów obiektowych).