cannot be resolved to a variable ??

cannot be resolved to a variable ??
OV
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 5 lat
  • Postów:19
0

Witam,

jestem początkujący w javie i przy próbie rozwiązania prostego zadania pojawia się komunikat "s cannot be resolved to a variable". Poniżej schemat:

Main.java

Kopiuj
public class Main {

	public static void main(String[] args) {
		
		Calculator suma = new Calculator(3,4);
		
		System.out.println(suma.infoSuma());
	}

}

Calculator.java

Kopiuj
public class Calculator {
	public double a,b;
	
	Calculator(double a, double b) {
		this.a = a;
		this.b = b;
	}
	
	public void add(double s) {
		s = a+b;
	}
	
	String infoSuma() {
		return "Suma wynosi: " + s;
	}
}

Proszę o pomoc. Nie rozumiem dlaczego problem dotyczy zmiennej s, skoro zadeklaraowana jest jako taki sam typ do a i b, czyli double. Ale może chodzi o coś innego.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Chodzi o to GDZIE jest zadeklarowana. Metoda klasy widzi TYLKO:

  • pola klasy
  • argumenty przekazane do metody

A u ciebie to w ogóle jakiś czeski film sie dzieje bo zmienna s występuje tylko w metodize add której nigdy nawet nie użyłeś. Równie dobrze mógłbyś ją skasowac ;]


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
OV
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 5 lat
  • Postów:19
0

Wiem, ze do dziwnie wygląda, ale chciałem poćwiczyć stosowanie metod. Ok. też w końcu doszedłem do wniosku, ze jest zbędna. usunąłem ją i zmieniłem ten fragment

Kopiuj
String infoSuma() {
        return "Suma wynosi: " + (a+b); 

Dziękuję za podpowiedź.

edytowany 2x, ostatnio: bogdans
RE
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:34
0

Shalom juz Ci odpowiedział, ja tylko doprecyzuję. Metoda infoSuma() nie ma dostępu do zmiennej s, ponieważ ta zmienna jest tworzona kiedy wywołujesz metodę add(). Do zmiennej s (parametru metody) jest przypisywana wartość argumentu przekazanego do metody add, co jest bez sensu, bo dalej przypisujesz do niej sumę zmiennych a i b, wiec wartosc argumentu jest tracona (nie została wykorzystana) na rzecz sumy pól a i b ( tak się nazywają zminne zadeklarowane bezpośrednio w klasie - pola). Po tym jak metoda add sie wykona, zmienna s jest usuwana z "programu", dlatego, że parametry metod mają tylko zasieg lokalny i są usuwane wraz z zakończeniem funkcji. Kiedy chciałbyś wywołać funkcję infoSuma(), wtedy zmienna s już nie istnieje, dlatego kompilator wyświetla taki błąd.

edytowany 1x, ostatnio: rekrut
SO
Po tym jak metoda add sie wykona, zmienna s jest usuwana z "programu", dlatego, że parametry metod typu prymitywnego (nie obiektowego) mają tylko zasieg lokalny i są usuwane wraz z zakończeniem funkcji. ... Jakby do metody add przekazywał typ referencyjny to nic by to nie zmieniło. A usuwana to jest kopia zmiennej s bo parametry mają zasięg lokalny.
RE
@some_ONE tak, tak, jasne. Masz w 100% rację. Mój błąd. Usunąłem ten fragment przed Twoją odpowiedzią i miałem nadzieję, że nikt tego nie przeczytał, a jednak. Pomyliłem sie bo na myśli miałem to, że jak do metody przekazuje się zmienną obiektową i zmienia się wartosć jej pól to zmienna przekazana jako argument też sie zmieni.
OV
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 5 lat
  • Postów:19
0

Dziękuję wszystkim za wyjaśnienia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.