Різниця між статичними методами та методами екземпляра


89

Я просто читав текст, даний мені в моєму підручнику, і я не зовсім впевнений, що розумію, що він говорить. Це в основному говорить мені, що статичні методи або методи класу включають ключове слово "модифікатор" static. Але я насправді не знаю, що це означає?

Чи може хтось пояснити мені, по-справжньому простими словами, що таке статичні методи або методи класу?

Крім того, чи можу я отримати просте пояснення, що таке методи Instance?

Ось що вони дають мені в підручнику:

Існують важливі практичні наслідки наявності або відсутності статичного модифікатора. Відкритий метод класу може бути викликаний і виконаний, як тільки Java обробляє визначення класу, до якого він належить. Це не стосується методу екземпляра. Перш ніж публічний метод екземпляра може бути викликаний і виконаний, слід створити екземпляр класу, до якого він належить. Щоб використовувати метод публічного класу, вам просто потрібен клас. З іншого боку, перш ніж ви зможете використовувати метод загальнодоступного екземпляра, ви повинні мати екземпляр класу.

Спосіб використання статичного методу у визначенні іншого методу змінюється залежно від того, належать два методи до одного класу чи ні. У наведеному вище прикладі факторіал та main - це обидва методи класу MainClass. Як результат, виклик факторіалу у визначенні main просто посилається на назву методу, "факторіал".

Відповіді:


162

Основною парадигмою Java є те, що ви пишете класи, і що ці класи створюються за допомогою екземпляра. Екземпляри об'єктів (екземпляр класу) мають пов'язані з ними атрибути (змінні члени), що впливають на їх поведінку; коли екземпляр виконує метод, він посилатиметься на ці змінні.

Однак усі об'єкти певного типу можуть мати поведінку, яка взагалі не залежить від змінних-членів; ці методи найкраще робити статичними. Будучи статичним, для запуску методу не потрібен жоден екземпляр класу.

Ви можете зробити це, щоб виконати статичний метод:

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

Але щоб виконати нестатичний метод, потрібно зробити це:

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

На більш глибокому рівні компілятор, збираючи клас, збирає вказівники на методи і приєднує їх до класу. Коли ці методи виконуються, він слідує за вказівниками і виконує код у дальньому кінці. Якщо інстанціюється клас, створений об'єкт містить покажчик на "таблицю віртуальних методів", який вказує на методи, які слід викликати для цього конкретного класу в ієрархії успадкування. Однак, якщо метод є статичним, не потрібна "віртуальна таблиця методів": всі виклики цього методу надходять у те саме місце в пам'яті для виконання того самого коду. З цієї причини у високопродуктивних системах краще використовувати статичний метод, якщо ви не покладаєтесь на змінні екземпляра.


2
велике спасибі за приклади коду, які вони виглядають знайомими, тому я зараз розумію
Панті

4
@Rohan Ще один хороший спосіб розглянути це те, що будь-що static(клас, метод або поле) насправді ні до чого не належить, воно просто висить у класі з організаційними цілями.
gobernador

1
крім того, статичні поля використовуються як об'єкти даних (той, що зберігає дані і, отже, не може їх змінювати, але ви можете маніпулювати даними всередині них.). Статичні методи можна викликати лише для статичних полів, і відтепер він несе те саме поняття залишатися незмінним або не змінюватися або не інстанціювання !!
user2416728

1
@ user2416728 Ваш коментар дуже заплутаний. Статичні поля можна змінювати, але їх обсяг є загальним для середовища їх виконання. Отже, будь-який код, який має доступ до згаданого поля, має доступ до тих самих даних. Це не еквівалентно тим, що дані залишаються незмінними (якщо не використовується модифікатор 'final').
Натаніель Форд

2
так, "не змінювати" >> я мав на увазі, що неможливо створити екземпляр !!
user2416728 02

19

Методи та змінні, які не оголошені як статичні, відомі як методи екземпляра та змінні екземпляра. Щоб звернутися до методів та змінних екземпляра, спочатку потрібно створити екземпляр класу, тобто спочатку потрібно створити об'єкт цього класу. Для статичного не потрібно створювати екземпляр класу, ви можете отримати доступ до методів та змінних з іменем класу за допомогою знаку точки який знаходиться в (.)

наприклад:

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

для нестатичного методу ви повинні створити екземпляр класу.

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.

8

Статичні методи, змінні належать усьому класу, а не лише екземпляру об'єкта. Статичний метод, змінна пов'язана з класом в цілому, а не з конкретними екземплярами класу. Кожен об’єкт матиме спільну копію статичних методів, змінних. У класі є лише одна копія, незалежно від того, скільки об’єктів з нього створено.


8

Різниця між статичними методами та методами екземпляра

  1. Метод екземпляра - це методи, які вимагають створення об’єкта свого класу перед тим, як його можна викликати. Статичні методи - це методи в Java, які можна викликати без створення об'єкта класу.

  2. Статичний метод оголошується із ключовим словом static. Метод екземпляра не має статичного ключового слова.

  3. Статичний метод означає, який буде існувати як одна копія для класу. Але методи екземпляру існують у вигляді декількох копій залежно від кількості екземплярів, створених для цього класу.

  4. Статичні методи можна викликати, використовуючи посилання на клас. Екземпляр або нестатичні методи викликаються за допомогою посилання на об'єкт.

  5. Статичні методи не можуть отримати безпосередній доступ до методів екземпляра та змінних екземпляра. Метод екземпляра може отримувати безпосередній доступ до статичних змінних та статичних методів.

Довідково: geeksforgeeks


4

Методи екземпляру => викликаються на конкретному екземплярі певного класу. Метод хоче знати, для якого класу він був викликаний. Те, як це відбувається, є невидимий параметр, який називається "це". Усередині 'this' у нас є члени класу екземпляра, уже встановлені зі значеннями. "Це" не є змінною. Це значення, ви не можете його змінити, і воно є посиланням на одержувача дзвінка. Приклад: Ви викликаєте ремонтників (метод екземпляра), щоб виправити ваш телевізор (фактична програма). Він постачається з інструментами (параметр 'this'). Він постачає спеціальні інструменти, необхідні для виправлення телевізора, і він може також виправити інші речі.

У статичних методах => немає такого поняття, як "це". Приклад: Той самий ремонтник (статичний метод). Коли ви телефонуєте йому, ви повинні вказати, якого ремонтника викликати (наприклад, електрика). І він прийде і полагодить лише ваш телевізор. Але він не має інструментів для виправлення інших речей (параметр 'this' не існує).

Статичні методи зазвичай корисні для операцій, для яких не потрібні дані з екземпляра класу (з 'this') і можуть виконувати цільове призначення виключно використовуючи їх аргументи.


2

Поведінка об'єкта залежить від змінних та методів цього класу. Коли ми створюємо клас, ми створюємо для нього об'єкт. Для статичних методів ми їх не вимагаємо, оскільки статичні методи означають, що всі об’єкти матимуть однакову копію, тому об’єкт не потрібен. наприклад:

Myclass.get();

У методі екземпляра кожен об'єкт буде мати різну поведінку, тому їм доведеться викликати метод, використовуючи екземпляр об'єкта. наприклад:

Myclass x = new Myclass();
x.get();

1

Якщо стан методу не слід змінювати або він не буде використовувати будь-які змінні екземпляра.

Ви хочете викликати метод без екземпляра.

Якщо це працює лише на аргументи, надані йому.

Службові функції - хороший приклад статичних методів. тобто math.pow (), ця функція не збирається змінювати стан для різних значень. Тож це статично.


1

Коротше кажучи, статичні методи та статичні змінні є рівнем класу, де як методи екземпляра та змінні екземпляра є рівнем екземпляра або об'єкта.

Це означає, що кожного разу, коли створюється екземпляр або об'єкт (за допомогою нового ClassName ()), цей об'єкт зберігатиме власну копію змінних instace. Якщо у вас є п’ять різних об’єктів одного класу, у вас буде п’ять різних копій змінних екземпляра. Але статичні змінні та методи будуть однаковими для всіх цих п'яти об'єктів. Якщо вам потрібно щось загальне для використання кожним створеним об’єктом, зробіть це статичним. Якщо вам потрібен метод, для роботи якого не потрібні конкретні об’єктні дані, зробіть його статичним. Статичний метод працюватиме лише зі статичною змінною або повертатиме дані на основі переданих аргументів.

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);
    }
}

У наведеному вище прикладі при виклику add () як:

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
    }
}

У першому класі функція add () поверне суму даних, переданих конкретним об'єктом. Але статичний метод можна використовувати для отримання суми з будь-якого класу, не незалежного від будь-якого конкретного екземпляра чи об'єкта. Отже, для загальних методів, яким потрібні лише аргументи, можна стати статичними, щоб зберегти все це СУХИМ.


0

Метод екземпляра проти статичного методу

  1. Метод екземпляра може отримати безпосередній доступ до методів екземпляра та змінних екземпляра.

  2. Метод екземпляра може отримувати безпосередній доступ до статичних змінних та статичних методів.

  3. Статичні методи можуть отримувати безпосередній доступ до статичних змінних та статичних методів.

  4. Статичні методи не можуть отримати безпосередній доступ до методів екземпляра та змінних екземпляра. Вони повинні використовувати посилання на об'єкт. А статичний метод не може використовувати це ключове слово, оскільки немає екземпляра для посилання 'this'.


-2

Статичний модифікатор, розміщений перед функцією, означає, що існує лише одна копія цієї функції. Якщо статичний модифікатор не розміщений перед функцією, тоді з кожним об'єктом або екземпляром цього класу створюється нова копія цієї функції. :) Те саме відбувається зі змінними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.