Jak metodą zmienić pole klasy?

0

Witam.
Mam taki oto prosty kod:

public class test {

	private int liczba = 0;
		
	public void setLiczba(int wart)
	{
		this.liczba = wart;
	}
	
	public static void main(String[] args) 
	{
		test.
	}

}

Chciałbym zmienić wartość pola klasy za pomocą metody.
Gdy kod jest taki jak powyżej, nie mogę użyć metody setLiczba, natomiast gdy dodam "static" do metody:

public class test {

	private int liczba = 0;
		
	public static void setLiczba(int wart)
	{
		this.liczba = wart;   <-- błąd
	}
	
	public static void main(String[] args) 
	{
		test.setLiczba(1);
	}

}

to mogę jej użyć, jednak wtedy niedozwolone jest słowo kluczowe "this" w tej metodzie, ponieważ nie mogę zmienić metodą statyczną pola niestatycznego.

Jak to rozwiązać?
Z góry przepraszam za niski poziom, nie mogę jednak znaleźć sposobu na to.
Dziękuję za odpowiedzi.

0
  1. private static int liczba
  2. nie trzeba pisać this jeśli nie ma konfliktu nazw, wystarczy liczba = wart
  3. setLiczba() i liczba nie muszą być static:
test t = new test();
t.setLiczba(5);
1

Trochę mieszasz. Nie utworzyłeś jeszcze obiektu klasy test a już operujesz na tym obiekcie. 2 przykład był by dobry gdyby pole liczba było również statyczne ale wtedy obiektowość z której Java słynie poszła by się j*bać :D

public class Test {
 
    private int liczba = 0;
 
    public void setLiczba(int wart)
    {
        this.liczba = wart;
    }
 
    public static void main(String[] args) 
    {
        Test obiekt = new Test();
        obiekt.setLiczba(2);
    }
 
}

Nazwy klas przyjęło się pisać od dużej litery.

0

Ok, dziękuję za odpowiedzi.
Metoda ma być statyczna, więc pole metody też zrobiłem statyczne.

public class Test {

	private  static int liczba = 0;
	
	public static void setLiczba(int wart)
	{
		liczba = wart;
	}
	
	public static void main(String[] args) {
		
		test.setLiczba(1);
		
		System.out.println(test.liczba);
	}

}

Mam jeszcze pytania:

  1. Gdyby jednak nastąpił konflikt nazw, tak jak napisał @twonek w punkcie drugim, to czy można to rozwiązać tak jak poniżej?
Test.liczba = wart;
  1. Czy utworzenie statycznego pola jest niekorzystne w jakimś z przypadków?
    @miej95 Tak ma właśnie być, że nie pracuję na obiekcie, w moim przypadku nie ma potrzeby tworzenia obiektu. Mógłbyś rozwinąć, o co chodzi z tą obiektowością? Nie mogę wtedy skorzystać z wszystkich metod dziedziczonych od Object?
0

Dobra, z tą obiektowością już rozumiem. Nie będę mógł stworzyć pola, które jest tylko dla danego obiektu - pole zawsze będzie takie samo dla wszystkich obiektów w całej klasie. Ale w moim przypadku nie będę tworzył obiektów, więc wszystko będzie w porządku.

0
Złoty Samiec napisał(a):
  1. Gdyby jednak nastąpił konflikt nazw, tak jak napisał @twonek w punkcie drugim, to czy można to rozwiązać tak jak poniżej?
Test.liczba = wart;

Nie, wtedy się rozwiązuje dokładnie tak jak miałeś na początku:

public void setLiczba(int liczba) {
    this.liczba = liczba;
}
0

Z obiektowością chodzi o to, że jeśli masz w kodzie wszystkie metody i pola static, to mimo, że korzystasz z obiektowego języka, nie korzystasz z paradygmatu obiektowego. Twój kod jest wtedy proceduralny, więc równie dobrze mógłbyś go napisać w Pascalu albo w C.

0

@somekind, ok, rozumiem. Dziękuję za wytłumaczenie.
@twonek, w statycznej metodzie, dla statycznego pola, nie mogę użyć this, jest zgłaszany error: Cannot use this in a static context.

0
Złoty Samiec napisał(a):

@somekind, ok, rozumiem. Dziękuję za wytłumaczenie.
@twonek, w statycznej metodzie, dla statycznego pola, nie mogę użyć this, jest zgłaszany error: Cannot use this in a static context.

Oczywiście, że nie możesz, bo this to odwołanie do aktualnego obiektu. Statyczna metoda nie istnieje w obiekcie, więc nie można się z niej do obiektu odwoływać.

0

Ok.
Teraz już wszystko jasne.
Dziękuję wszystkim za odpowiedzi.
Powodzenia ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1