Różnica między metodami statycznymi a metodami instancji

88

Właśnie przeczytałem tekst podany mi w podręczniku i nie jestem pewien, czy rozumiem, co on mówi. Zasadniczo mówi mi, że metody statyczne lub metody klas zawierają słowo kluczowe „modyfikator” static. Ale tak naprawdę nie wiem, co to znaczy?

Czy ktoś mógłby mi wyjaśnić w bardzo prosty sposób, czym są metody statyczne lub klasowe?

Czy mogę również uzyskać proste wyjaśnienie, jakie są metody instancji?

Oto, co podają mi w podręczniku:

Istnieją ważne praktyczne implikacje obecności lub braku modyfikatora statycznego. Publiczną metodę klasy można wywołać i wykonać, gdy tylko Java przetworzy definicję klasy, do której należy. Nie ma to miejsca w przypadku metody instancji. Przed wywołaniem i wykonaniem metody instancji publicznej należy utworzyć instancję klasy, do której należy. Aby użyć metody klasy publicznej, potrzebujesz tylko klasy. Z drugiej strony, zanim będzie można użyć metody instancji publicznej, należy mieć instancję tej klasy.

Sposób, w jaki metoda statyczna jest wywoływana w ramach definicji innej metody, różni się w zależności od tego, czy te dwie metody należą do tej samej klasy, czy nie. W powyższym przykładzie silnia i main są metodami klasy MainClass. W rezultacie wywołanie silni w definicji main po prostu odwołuje się do nazwy metody „silnia”.

Panthy
źródło

Odpowiedzi:

161

Podstawowym paradygmatem w Javie jest pisanie klas i tworzenie ich instancji. Obiekty, dla których utworzono instancję (instancja klasy), mają przypisane do nich atrybuty (zmienne składowe), które wpływają na ich zachowanie; gdy instancja ma wykonaną metodę, będzie odwoływać się do tych zmiennych.

Jednak wszystkie obiekty określonego typu mogą mieć zachowanie, które w ogóle nie jest zależne od zmiennych składowych; te metody najlepiej wykonywać statycznie. Ponieważ klasa jest statyczna, do uruchomienia metody nie jest wymagane żadne wystąpienie klasy.

Możesz to zrobić, aby wykonać metodę statyczną:

MyClass.staticMethod();//Simply refers to the class's static code

Ale aby wykonać metodę niestatyczną, musisz zrobić to:

MyClass obj = new MyClass();//Create an instance
obj.nonstaticMethod();//Refer to the instance's class's code

Na głębszym poziomie, gdy kompilator składa razem klasę, zawiera kilka wskaźników do metod. Gdy te metody są wykonywane, następuje po wskaźnikach i wykonuje kod na drugim końcu. Jeśli tworzona jest instancja klasy, utworzony obiekt zawiera wskaźnik do „tabeli metod wirtualnych”, która wskazuje metody, które mają zostać wywołane dla tej konkretnej klasy w hierarchii dziedziczenia. Jeśli jednak metoda jest statyczna, nie jest potrzebna żadna „wirtualna tabela metod”: wszystkie wywołania tej metody trafiają do dokładnie tego samego miejsca w pamięci, aby wykonać dokładnie ten sam kod. Z tego powodu w systemach o wysokiej wydajności lepiej jest używać metody statycznej, jeśli nie jesteś zależny od zmiennych instancji.

Nathaniel Ford
źródło
2
bardzo dziękuję za przykłady kodu, które wyglądają znajomo, więc teraz rozumiem
Panthy
4
@Rohan Innym dobrym sposobem spojrzenia na to jest to, że wszystko static(klasa, metoda lub pole) tak naprawdę do niczego nie należy, po prostu wisi w klasie ze względów organizacyjnych.
gobernador
1
dodatkowo pola statyczne są używane jako obiekty danych (takie, które przechowują dane i dlatego nie mogą się zmieniać, ale można w nich manipulować danymi). Metody statyczne mogą być wywoływane tylko na polach statycznych i odtąd mają tę samą koncepcję pozostawania stałymi lub niezmiennymi lub bez tworzenia instancji !!
user2416728
1
@ user2416728 Twój komentarz jest bardzo zdezorientowany. Pola statyczne można zmieniać, ale ich zakres jest globalny dla środowiska wykonywania. Dlatego każdy kod, który ma dostęp do wspomnianego pola, ma dostęp do tych samych danych. Nie jest to równoznaczne z tym, że dane pozostają stałe (chyba że zastosowano modyfikator „końcowy”).
Nathaniel Ford
2
tak, "nie zmieniaj" >> miałem na myśli, że nie można utworzyć instancji !!
user2416728,
19

Metody i zmienne, które nie są zadeklarowane jako statyczne, nazywane są metodami instancji i zmiennymi instancji. Aby odwołać się do metod i zmiennych instancji, musisz najpierw utworzyć instancję klasy, co oznacza, że ​​powinieneś najpierw utworzyć obiekt tej klasy. która jest w (.)

na przykład:

Person.staticMethod();           //accessing static method.

w przypadku metody niestatycznej należy utworzyć instancję klasy.

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.
Khalid Ahmed Khichi
źródło
8

Metody statyczne, zmienne należą do całej klasy, a nie tylko do instancji obiektu. Metoda statyczna, zmienna, jest powiązana z klasą jako całością, a nie z określonymi instancjami klasy. Każdy obiekt będzie miał wspólną kopię metod statycznych, zmiennych. Istnieje tylko jedna kopia na klasę, niezależnie od tego, ile obiektów jest z niej utworzonych.

Paulius Matulionis
źródło
8

Różnica między metodami statycznymi a metodami instancji

  1. Metoda instancji to metody, które wymagają utworzenia obiektu swojej klasy, zanim będzie można go wywołać. Metody statyczne to metody w Javie, które można wywołać bez tworzenia obiektu klasy.

  2. Metoda statyczna jest deklarowana za pomocą słowa kluczowego static. Metoda instancji nie zawiera statycznego słowa kluczowego.

  3. Metoda statyczna oznacza, że ​​będzie istnieć jako pojedyncza kopia dla klasy. Ale metody instancji istnieją jako wiele kopii w zależności od liczby instancji utworzonych dla tej klasy.

  4. Metody statyczne można wywołać przy użyciu odwołania do klasy. Metody instancji lub metody niestatyczne są wywoływane przy użyciu odwołania do obiektu.

  5. Metody statyczne nie mają bezpośredniego dostępu do metod instancji i zmiennych instancji. Metoda instancji może uzyskać bezpośredni dostęp do zmiennych statycznych i metod statycznych.

Źródła : geeksforgeeks

zrazy
źródło
4

Metody instancji => wywoływane na konkretnej instancji określonej klasy. Metoda chce wiedzieć, dla której klasy została wywołana. Sposób, w jaki to się dzieje, to niewidoczny parametr o nazwie „this”. Wewnątrz „this” mamy już ustawione elementy klasy instancji z wartościami. „To” nie jest zmienną. Jest to wartość, której nie można zmienić, a wartość odnosi się do odbiorcy połączenia. Np. Dzwonisz do mechaników (metoda instancji), aby naprawić telewizor (rzeczywisty program). Jest wyposażony w narzędzia (parametr „ten”). Jest wyposażony w specjalne narzędzia potrzebne do naprawy telewizora i może również naprawić inne rzeczy.

W metodach statycznych => nie ma czegoś takiego jak „to”. Np .: ten sam mechanik (metoda statyczna). Dzwoniąc do niego, musisz określić, do którego mechanika zadzwonić (np. Elektryka). A on przyjdzie i naprawi tylko twój telewizor. Ale nie ma narzędzi do naprawiania innych rzeczy (nie ma parametru „ten”).

Metody statyczne są zwykle przydatne w przypadku operacji, które nie wymagają żadnych danych z instancji klasy (z „this”) i mogą realizować swój zamierzony cel wyłącznie przy użyciu swoich argumentów.

Eldiyar Talantbek
źródło
2

Zachowanie obiektu zależy od zmiennych i metod tej klasy. Kiedy tworzymy klasę, tworzymy dla niej obiekt. W przypadku metod statycznych ich nie wymagamy, ponieważ metody statyczne oznaczają, że wszystkie obiekty będą miały tę samą kopię, więc nie ma potrzeby używania obiektu. na przykład:

Myclass.get();

W przypadku metody instancji każdy obiekt będzie zachowywał się inaczej, więc będą musieli wywołać metodę za pomocą instancji obiektu. na przykład:

Myclass x = new Myclass();
x.get();
Vishal Patil
źródło
1

Jeśli stan metody nie ma zostać zmieniony lub nie będzie używała żadnych zmiennych instancji.

Chcesz wywołać metodę bez instancji.

Jeśli działa tylko na dostarczonych argumentach.

Funkcje narzędziowe są dobrym przykładem metod statycznych. tj. math.pow (), ta funkcja nie zmieni stanu dla różnych wartości. Więc to jest statyczne.

suketup
źródło
1

Krótko mówiąc, metody statyczne i zmienne statyczne są na poziomie klasy, podczas gdy metody instancji i zmienne instancji są na poziomie instancji lub obiektu.

Oznacza to, że za każdym razem, gdy tworzona jest instancja lub obiekt (przy użyciu nowej ClassName ()), obiekt ten zachowa własną kopię zmiennych instancji. Jeśli masz pięć różnych obiektów tej samej klasy, będziesz mieć pięć różnych kopii zmiennych instancji. Ale statyczne zmienne i metody będą takie same dla wszystkich pięciu obiektów. Jeśli potrzebujesz czegoś wspólnego dla każdego utworzonego obiektu, ustaw go jako statyczny. Jeśli potrzebujesz metody, która nie wymaga do działania danych specyficznych dla obiektu, uczyń ją statyczną. Metoda statyczna zadziała tylko ze zmienną statyczną lub zwróci dane na podstawie przekazanych argumentów.

class A {
    int a;
    int b;

    public void setParameters(int a, int b){
        this.a = a;
        this.b = b;
    }
    public int add(){
        return this.a + this.b;
   }

    public static returnSum(int s1, int s2){
        return (s1 + s2);
    }
}

W powyższym przykładzie, gdy wywołujesz add () jako:

A objA = new A();
objA.setParameters(1,2); //since it is instance method, call it using object
objA.add(); // returns 3 

B objB = new B();
objB.setParameters(3,2);
objB.add(); // returns 5

//calling static method
// since it is a class level method, you can call it using class itself
A.returnSum(4,6); //returns 10

class B{
    int s=8;
    int t = 8;
    public addition(int s,int t){
       A.returnSum(s,t);//returns 16
    }
}

W pierwszej klasie add () zwróci sumę danych przekazanych przez określony obiekt. Jednak metoda statyczna może służyć do uzyskania sumy z dowolnej klasy, która nie jest niezależna od konkretnego wystąpienia lub obiektu. W związku z tym dla metod ogólnych, które potrzebują tylko argumentów do działania, można ustawić je jako statyczne, aby zachować je wszystkie jako SUCHE.

Prakash
źródło
0

Metoda instancji a metoda statyczna

  1. Metoda instancji może uzyskać bezpośredni dostęp do metod instancji i zmiennych instancji.

  2. Metoda instancji może uzyskać bezpośredni dostęp do zmiennych statycznych i metod statycznych.

  3. Metody statyczne mogą uzyskiwać bezpośredni dostęp do zmiennych statycznych i metod statycznych.

  4. Metody statyczne nie mają bezpośredniego dostępu do metod instancji i zmiennych instancji. Muszą używać odniesienia do obiektu. Metoda statyczna nie może używać tego słowa kluczowego, ponieważ nie ma instancji „this”, do której można by się odwołać.

param
źródło
-2

Modyfikator static umieszczony przed funkcją oznacza, że ​​istnieje tylko jedna kopia tej funkcji. Jeśli modyfikator statyczny nie jest umieszczony przed funkcją, to dla każdego obiektu lub instancji tej klasy tworzona jest nowa kopia tej funkcji. :) Tak samo jest ze zmiennymi.

Prakhar Mohan Srivastava
źródło