• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przekazywanie wartość do metod i metody statyczne

Object Storage Arubacloud
0 głosów
307 wizyt
pytanie zadane 9 maja 2017 w Java przez rubesom Obywatel (1,690 p.)

Korzystam z poradnika w sieci dotyczącego javy i mam kilka pytań

package testy2;

import java.util.Set;

public class Test1 
{
	
	private int zmienna1;
	
	public void setZmienna1(int zmienna1)
	{
		this.zmienna1 = zmienna1;
	}
	
	public int getZmienna1()
	{
		return zmienna1;
	}
	
	public Test1()
	{
		this(1);
	}
	
	public Test1(int a)
	{
		zmienna1 = a;
	}
	
	public String toString()
	{
		return "Opis";
	}
	
	public int  oblicz()
	{
		return zmienna1 = zmienna1 *2;
	}
	
	public int oblicz2()
	{
		int temp = zmienna1;
		temp = temp * 10;
		return temp;
	}
	
	public void oblicz3(int a)
	{
		int temp = getZmienna1();
		temp = temp *2;
		setZmienna1(temp);
	}
	public static void main(String[] args) 
	{

		Test1 test1 = new Test1();

		test1.setZmienna1(2);
		System.out.println(test1.oblicz());
		System.out.println(test1.getZmienna1());
		System.out.println(test1.oblicz2());
		test1.oblicz3(100);
		System.out.println(test1.getZmienna1());
		
	}

}

1. W metodzie "main" za pomocą ustawiam pole na wartość 2. Pierwsze wywołanie to metoda "oblicz". Tutaj do metody jest pobierana/przekazywana wartość z pola "zmienna1" która została ustawiona na 2?

2. Dla czego metoda "oblicz2" przechowuje wartość po wyliczeniach z poprzedniej metody ("oblicz") jeżeli wartość jest przekazywana przez "wartość" - obliczana w ciele metody i tyle (typ prosty)?

3. Czemu wynik wyświetlany po wykonaniu metody "oblicz3" daje 8, a nie spodziewane 200? Da się to zrobić w ten sposób (na prymitywach) czy trzeba to napisać obiektowo?

4. Kompletnie nie rozumiem założenia metod statycznych. Z definicji wiem tyle " dotyczy klasy a nie obiektu, tzn. dla wszystkich obiektów danej klasy pole statyczne ma tę samą wartość.". W praktyce przerabiałem to sobie na kursie Pana Zelenta z polem "ID" ale nie rozumiem jak się to ma do klas i jak to wykorzystać pisząc kod, jakie to ma konsekwencje... Proszę o pomoc.

 

2 odpowiedzi

0 głosów
odpowiedź 9 maja 2017 przez Mateusz51 Nałogowiec (28,180 p.)
wybrane 12 maja 2017 przez rubesom
 
Najlepsza
1i2. Metoda oblicz wewnątrz siebie korzysta ze zmienna1. I nawet nie tyle jest pobierana czy przekazana wartosc tylko obliczenia wykonywane są na dokładnie tej zmiennej. Zwłaszcza że przypusujesz do zmiennej1 wartosc dwa razy wiekszą w oblicz1.

3. Daje Ci osiem ponieważ nie wykorzystujesz nigdzie przekazanego parametru a.

4. W zmiennych statycznych chodzi o to że nie są powiązanne z jednym obiektem. Tzn jak byś swtorzył dwa obiekty i na jednym wykonał 3 razy oblicz1 a na drugim tylko raz to wartosci zmiennej1 róznił by się w zależnosci od obiektu. Za to gdyby zmienna1 była zmienna statyczna oba obiekty miały by tą samą wartość zmienna1.

Mam nadzieje że wyjaśniłem. Jeśli nie dokładnie coś wytłumaczyłem lub masz wątpliwośći to pytaj w ramach możliwosci postaram Ci się odpowiedzieć.
komentarz 10 maja 2017 przez rubesom Obywatel (1,690 p.)

Bardzo dużo mi się wyjaśniło.

Odnośnie jeszcze metody "oblicz3", czy w praktyce ma sens coś takiego?

	public void oblicz3(int x)
	{
		int temp = x;
		temp = temp *2;
		setZmienna1(temp);
	}

	public static void main(String[] args) 
	{

		Test1 test1 = new Test1();


		test1.oblicz3(100);
		System.out.println(test1.getZmienna1());
        }

Czy pracuje się raczej na akcesorach i mutatorach?

komentarz 10 maja 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Nie wiem zabardzo o co mnie pytasz. Bardzo czesto w metodach używa się setCośtam.
komentarz 11 maja 2017 przez rubesom Obywatel (1,690 p.)

Mam konkretne pytanie... Jestem w stanie przekazać parametr do metody w innej klasie i z tej metody skorzystać:


public class Test2 
{

	public static void main(String[] args) 
	{

		Test1 a = new Test1();
		a.setZmienna1(10);
		System.out.println(a.getZmienna1());
		System.out.println(a.oblicz());
		
	}

}

Po co mi do tego dziedziczenie? Rozumiem, że za pomocą słówka kluczowego "super" mogę się odwołać bezpośrednio do nad klasy - chodzi o to, że nie muszę tworzyć obiektu danej klasy i poprawia to przejrzystość kodu? Czy chodzi o coś więcej?

komentarz 12 maja 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Dziedziczenia używasz się po to, aby rozszerzyć funkcjonalności danej klasy. Za to odwoływanie się do innych klas nic wspólnego z dziedziczeniem mieć nie musi.

Przykład jaki podałeś jest dość typowy i zazwyczaj właśnie tak operuje się na obiektach.

Przez dziedziczenie albo uwspólniasz pewne metody albo pozwalasz na polimorfizm.
komentarz 12 maja 2017 przez rubesom Obywatel (1,690 p.)

Chodzi mi o to, że nie widzę sensu korzystania z dziedziczenia kiedy mogę ten sam efekt uzyskać jak w kodzie wyżej - jestem w stanie korzystać z metod nad klasy bez dziedziczenia.

Tak jak wyżej:

public class Test2 
{
 
    public static void main(String[] args) 
    {
 
        Test1 a = new Test1();
        a.setZmienna1(10);
        System.out.println(a.getZmienna1());
        System.out.println(a.oblicz());
         
    }
 
}

A tu to samo dzięki dziedziczeniu

public class Test2 extends Test1
{

	public Test2()
	{
		this(1);
	}
	
	public Test2(int k)
	{
		super(k);
	}
	
	public static void main(String[] args) 
	{

//		Test1 a = new Test1();
//		a.setZmienna1(10);
//		System.out.println(a.getZmienna1());
//		System.out.println(a.oblicz());
		Test2 test2 = new Test2();
		test2.setZmienna1(10);
		System.out.println(test2.getZmienna1());
		System.out.println(test2.oblicz());
		
	}

}

Po co robić sobie więcej pracy, gdzie dziedzicząc muszę tworzyć/modyfikować kunstruktory?

Mam nadzieje, że jasno opisałem to co chodzi mi po głowie. Z tego co się nauczyłem do tej pory to mogę w prostszy sposób uzyskać to co daje mi dziedziczenie.

Gdzie popełniam błąd?

komentarz 12 maja 2017 przez Mateusz51 Nałogowiec (28,180 p.)
Masz racje że możesz łatwiej uzyskać zaprezentowany efekt bez dziedziczenia. Nazywa się to agregacja.

Ale jak wspominałem dziedziczenie nie służy do tego aby uzyskiwać dostęp do metod innej klasy. Tylko do tego aby rozszerzać ich działanie i stosować rozwiazania polimorficzne.
0 głosów
odpowiedź 10 maja 2017 przez miro Pasjonat (23,870 p.)
Trochę już późno i nie do końca rozumiem 2 pierwsze pytania. Co do 3 pytania to nic nie robisz z przekazywaną wartością 100.

Jakbyś przemienił w twoim przykładzie metodę oblicz na static to nie musiałbyś tworzyć obiektu test1 przez Test1 test1 = new Test1(), tylko od razu mógłbyś wywołać ją przez oblicz(). Jakbyś chciał wywołać taką metodę w innej klasie to musisz podać też klasę w której się znajduje metoda Test1.oblicz(). Oczywiście taki kod byłby błędny ponieważ są pewne ograniczenia związane z metodami statycznymi:

- mogą wywoływać tylko inne metody statyczne  
- mają dostęp tylko do zmiennych statycznych  
- Metody statycznie nie mogą być przeciążane w klasie potomnej

W wymyślonym przeze mnie przykładzie błąd wynikałby przez to że metoda oblicz() korzysta z zmiennej nie statycznej zmienna1.

Podobne pytania

0 głosów
1 odpowiedź 421 wizyt
+2 głosów
2 odpowiedzi 5,141 wizyt
pytanie zadane 4 lutego 2017 w Java przez Wiciorny Ekspert (269,710 p.)
0 głosów
3 odpowiedzi 2,592 wizyt
pytanie zadane 21 grudnia 2016 w Java przez rubesom Obywatel (1,690 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...