Różnica między metodą a klasą

0

Cześć

Korzystam z poradnika jednego z youtuberów, który osobno omawia metody i klasy. Jaka jest różnica w tych podejściach?

double promien;

public double obliczPoleKola()
{
double pole;
pole = Math.PI*promien*promien;
return pole;

}

public static double  obliczPoleKola(double r)
{
double obwodKola =2*Math.PI*r;
return obwodKola;
}
0

Taka, że w pierwszym podejściu wartość zwracana przez metodę obliczPoleKola() uzależniona jest zawsze od wartości zmiennej globalnej promien. Natomiast w drugim podejściu, dzięki zastosowaniu metody z parametrem double r, możesz używać metody obliczPoleKola() dla różnych wartości zmiennej r, np.:

double p1 = obliczPoleKola(3);
double p2 = obliczPoleKola(5);
double p3 = obliczPoleKola(7);
0

Chyba nie trafiłeś z tematem - tak naprawdę pytasz czym się różni zwykła metoda od statycznej ;)

Tak pokrótce:
Zwykłe metody to składowe obiektu - uruchamiasz je na konkretnych obiektach (instancjach danej klasy), mają dostęp do pól obiektu.
Metody statyczne natomiast to składowe klasy - możesz je uruchamiać nie mając żadnego obiektu danej klasy (np. Klasa.metoda()), między innymi z tego powodu nie mają dostępu do pól obiektów tej klasy (inną kwestią są pola statyczne).

W Twoim przypadku: pierwsza metoda liczy pole konkretnego koła (obiektu dla którego zostanie wywołana), druga to taka metoda narzędziowa pozwalająca policzyć pole koła o podanym promieniu - niezależnie od tego w jakiej klasie ją umieścisz.

0
sihox napisał(a):

Zwykłe metody to funkcjonalności obiektu - uruchamiasz je na konkretnych obiektach (instancjach danej klasy), mają dostęp do pól obiektu.
Metody statyczne natomiast to funkcjonalności klasy - możesz je uruchamiać nie mając żadnego obiektu danej klasy (np. Klasa.metoda()), między innymi z tego powodu nie mają dostępu do pól obiektów tej klasy (inną kwestią są pola statyczne).

Metody to funkcje, a nie funkcjonalności.

0

Post bardziej teoretyczny niż porada jak programować:

Na dobrą sprawę żadna.

Zapis:

JakiśObiekt.nazwaMetody(parametr);

jest tożsamy z:

JakaśKlasa.nazwaMetodyStatycznej(JakiśObiekt, parametr);

Wykonalnym jest pisać kod korzystając z tylko jednej, ale na ogół pewne rzeczy lepiej, łatwiej, efektywniej czy ładniej jest zrobić jednym lub drugim sposobem.

dodanie znaczników <code class="java"> - @furious programming

0

Mam jeszcze trochę mętlik w głowie związany z nazewnictwem...
Chodzi mi o to, że w c++ to jest funkcją:

float ile_cali(float m)
{
return m*39.37;
} 

Czyli mam do czynienia w tym przykładzie i tymi dwoma wyżej z tworzeniem metod, klas i funkcji?

  1. Przy budowie klasy wartość zwracana jest uzależniona od wartości zmiennej (globalnej)?
  2. Przy budowie metody używając parametr
double r 

mogę użyć danej metody dla różnych wartości zmiennej r

?
3. Jak tworzyć funkcje w javie? Funkcja w c++ ma dla mnie bardzo podobną budowę jak metoda w javie? A może ta metoda (z pierwszego postu) jest funkcją dla javy?
2
  1. Przy budowie klasy wartość zwracana jest uzależniona od wartości zmiennej (globalnej)?

Czego wartość?

  1. Przy budowie metody używając parametr double r mogę użyć danej metody dla różnych wartości zmiennej r?

W sytuacji, gdy masz np. metodę:

public double getR(double r) {
     return r;
}

...to r jest parametrem, a nie zmienną. Natomiast, gdy użyjesz w/w metody i napiszesz getR(5), to 5 będzie określane jako argument metody getR() (zobacz: http://stackoverflow.com/questions/12709026/difference-between-arguments-and-parameters-in-java). Zmienną mógłbyś nazwać np. obiekt z, gdybyśmy zrobili coś takiego:

public double getR(double r) {
     double z = r; // Przypisuję wartość parametru `r` do zmiennej `z`.
     return z;
}

W tym przypadku z jest zmienną lokalną, bo nie może być wykorzystana na zewnątrz metody. Gdybyśmy chcieli uczynić z niej zmienną globalną to moglibyśmy napisać:

class Klasa {
     double z = 5;

     public double getR(double r) {
          return r + z;
     }
}

W takiej sytuacji, gdy utworzymy obiekt klasy Klasa i wywołamy dla niego metodę getR(5) w wyniku otrzymamy 10:

class Test {
     public static void main(String[] args) {
          Klasa obiekt = Klasa();
          double wynik = obiekt.getR(5);
          System.out.println(wynik);
     }
}

Oczywiście możemy użyć kilka razy metody getR(double r) dla różnych wartości parametru r. Sprawdź jaka będzie wartość zmiennej wynik z powyższego przykładu, gdy napiszesz coś takiego double wynik = obiekt.getR(5) + obiekt.getR(7);. Tutaj znajdziesz więcej informacji o zmiennych: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html

  1. Jak tworzyć funkcje w javie? Funkcja w c++ ma dla mnie bardzo podobną budowę jak metoda w javie? A może ta metoda (z pierwszego postu) jest funkcją dla javy?

W Javie nie ma funkcji, są metody. Metodę możesz zadeklarować na kilka różnych sposobów. Zanim je podam przyjrzyj się ogólnemu schematowi każdej metody w Javie:

modyfikator_dostępności typ_zwracanej_wartości nazwaMetody(Parametr parametr) {
     // Ciało metody.
}
  • Modyfikator dostępności określa, jak sama nazwa wskazuje, dostępność metody w różnych miejscach pisanego programu. Jego użycie jest opcjonalne, ale wskazane. Wyróżniamy modyfikatory public, private oraz protected. Można również oznaczyć metodę DODATKOWO jako static, np. public static void main(String[] args);. Jednak o tym porozmawiamy na innej lekcji.

  • Typ zwracanej wartości określa rodzaj obiektu, który zwraca metoda. Może to być np. double, int, String, JPanel, MojaKlasa itd. Wszystko, co jest obiektem, może być zwrócone przez metodę. Metoda może jednak nic nie zwracać. Wtedy zamiast typu zwracanej wartości piszemy void.

  • Nazwa zmiennej, to nazwa zmiennej. Ważne jest jednak ich nazewnictwo. Nazwa powinna być krótka i jasno odzwierciedlać to, co metoda robi. Należy się również stosować do konwencji formatowania nazwy metody, czyli nie nazywamy metody tak: moja_pierwsza_metoda, ale nazywamy tak: mojaPierwszaMetoda.

  • Parametr. Parametry już sobie z grubsza omówiliśmy. Można o nich powiedzieć więcej, ale jak będziesz głodny wiedzy, to na pewno chętnie przeczytasz:

http://www.tutorialspoint.com/java/java_methods.htm
https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html
https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
https://docs.oracle.com/javase/tutorial/reflect/class/classModifiers.html

Tutaj się zatrzymam i przytoczę kilka przykładów metod:

public void metodaKrzyczaca() {
     System.out.println("Hello Woooooooorld!");
}
public int metodaDodajacaDwieLiczbyCalkowite(int x, int y) {
     return x + y;
}
public static void main(String[] args) {
     System.out.println("Zadanie domowe - dowiedz się jak działa metoda main(String[] args)");
}
0

Mam problem z operowaniem na zadeklarowanych zmiennych:

	public static void main(String[] args) 
	{
		
		Scanner wejscie = new Scanner(System.in); 
		System.out.println("Podaj wartości, które dodać: ");
		int x = wejscie.nextInt();
		int y = wejscie.nextInt();
		
		Kalkulator obiekt = Kalkulator();
		int wynik = obiekt.dodawanie();
		System.out.println(dodawanie(2, 5));

	class Kalkulator
	{
	public int dodawanie(int a, int b)
		{
		int x = a;
		int y = b;
		return a + b;
		}
	} 

Chciałem uzyskać efekt gdzie mam klasę, która jest kalkulatorem a w niej są metody czyli działania arytmetyczne. Domyślam się, że można to zrobić bez używania metod i dodatkowej klasy ale chciałem to w ten sposób przećwiczyć.
Co robię nie tak?

0
rubesom napisał(a):

Co robię nie tak?

  • formatowanie kodu,
  • klasa Kalkulator wewnątrz metody main (tzn. tak można zrobić ale raczej tego nie potrzebujesz w tym przypadku),
  • metoda main "w powietrzu"? (albo nie wrzuciłeś całego kodu),
  • próba utworzenia obiektu tak: Kalkulator obiekt = Kalkulator(); zamiast Kalkulator obiekt = new Kalkulator();,
  • nieprawidłowe wywołanie obiekt.dodawanie(); (brak parametrów),
  • wywołanie nieistniejącej metody dodawanie(2,5),
  • różne fragmenty, z których nie korzystasz: deklaracja zmiennych x i y w metodzie dodawanie oraz wczytywanie liczb w main().
0

Cały kod:

import java.util.Scanner;

public class Metody {

	public static void main(String[] args) 
	{
		
		Scanner wejscie = new Scanner(System.in); 
		System.out.println("Podaj wartości, które dodać: ");
		int x = wejscie.nextInt();
		int y = wejscie.nextInt();
		
		Kalkulator obiekt = new Kalkulator();
		int wynik = obiekt.dodawanie(x, y);
		System.out.println(wynik);

	}
	
	class Kalkulator
	{
	public int dodawanie(int a, int b)
		{
		int x = a;
		int y = b;
		return a + b;
		}
	}
	
}

Myślałem, że muszę zadeklarować parametry metody "dodawanie" jako zmienne, żeby potem je pobrać z zewnątrz (od użytkownika).
Jak to zrobić, żeby działało jak napisałem wyżej?
Nie chcę iść na łatwiznę ale z materiału, który jest w sieci umiem zrobić tylko prostą metodę taką jak:

public class Test {

	public static void main(String[] args) 
	{
		System.out.println(przyklad(1, 1));

	}
	public static int przyklad (int a, int b)
	{
		return a + b;
		
	}
}

@Edit: Nie mam pojęcia czemu pomogło dodanie "static" do klasy "Kalkulator". Myślałem, że jak jest "static" to nie mogę zmieniać wartości takich zmiennych. O co chodzi?

usunięcie cytowania całego poprzedniego posta - @furious programming

1
class Main {
	public static void main(String[] args) {
		Scanner wejscie = new Scanner(System.in);
		System.out.println("Podaj wartości, które chcesz dodać:");
		int x = wejscie.nextInt();
		int y = wejscie.nextInt();
		wejscie.close();
		
		Kalkulator kalkulator = new Kalkulator();
		int wynik = kalkulator.dodawanie(x, y);
		System.out.println(wynik);
	}
}

class Kalkulator {
	public int dodawanie(int x, int y) {
		return x + y;
	}
}

PS Myśl...

0

Twój kod mi nie działa. Pomogło dopiero dodanie "static" do klasy "Kalkulator", chociaż nie wiem czemu. Myślałem, że jak jest "static" to nie mogę zmieniać wartości takich zmiennych. O co chodzi?

0

Pomogło dopiero dodanie "static" do klasy "Kalkulator", chociaż nie wiem czemu.

Pomogło, ponieważ źle przepisałeś kod... Nie umieszczaj klasy Kalkulator w ciele klasy Main, tylko umieść ją w osobnym pliku. Nie żongluj słowami kluczowymi w kodzie, jak nie wiesz jakie mają zastosowanie. Poczytaj.

0

Teraz już działa, dziękuje.
Męczy mnie jeszcze kwestie, że działało tak jak było zbudowane wcześniej ale po dodaniu do klasy "kalkulator" static. Jak to wpłynęło na kod, że zadziałało?

0

Męczy mnie jeszcze kwestie, że działało tak jak było zbudowane wcześniej ale po dodaniu do klasy "kalkulator" static. Jak to wpłynęło na kod, że zadziałało?

Zadziałało, ponieważ w sytuacji...

public class Main {
	public static void main(String[] args) {
		... // tutaj pozostała część kodu
		Kalkulator kalkulator = new Kalkulator();
		System.out.println(kalkulator.dodawanie(x, y));
	}
	
	static class Kalkulator {
		public int dodawanie(int x, int y) {
			return x + y;
		}
	}
}

...gdy Twój kod wyglądał tak, jak powyżej, próbowałeś wywołać metodę z klasy lokalnej (klasa Kalkulator) w metodzie zadeklarowanej jako statyczna (metoda main). Dlatego też wymagane było, aby zadeklarować klasę Kalkulator jako statyczną. Poniżej trochę informacji o składowych statycznych.

Ekhem, ekhem... Czasem zachodzi potrzeba zdefiniowania składowej klasy, która nie zależałaby od żadnego konkretnego obiektu tej klasy. W tradycyjnym podejściu składowa dostępna jest tylko w powiązaniu z konkretnym egzemplarzem klasy (obiektem). W Javie można jednak utworzyć składową udostępnianą bez podawania konkretnego obiektu. Aby utworzyć taki element, trzeba poprzedzić jego deklarację słowem kluczowym static. Składową statyczną można odczytywać i modyfikować, zanim zostaną utworzone jakiekolwiek obiekty klasy, i nie jest do tego potrzebna referencja do obiektu. Statyczne mogą być zarówno zmienne, jak i metody. Najlepszym przykładem składowej statycznej jest metoda main - musi zostać zadeklarowana ze słowem static, ponieważ jest wywoływana przed utworzeniem jakichkolwiek obiektów. Dodatkowo, zmienne składowe zadeklarowane jako statyczne są tak naprawdę zmiennymi globalnymi. Gdy Java tworzy obiekt takiej klasy, jej zmienne statyczne nie są kopiowane. Wszystkie obiekty klasy współdzielą tę samą zmienną statyczną.

Jakbyś przeczytał z uwagą, to co Ci podesłałem wcześniej, to wszystko stałoby się jasne.

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