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

88

Я просто читал текст, данный мне в моем учебнике, и не совсем уверен, что понимаю, о чем он говорит. По сути, он говорит мне, что статические методы или методы класса включают ключевое слово «модификатор» static. Но я действительно не знаю, что это значит?

Может ли кто-нибудь объяснить мне действительно простыми словами, что такое статические или классовые методы?

Кроме того, могу ли я получить простое объяснение того, что такое методы экземпляра?

Вот что мне дают в учебнике:

Наличие или отсутствие модификатора static имеет важные практические последствия. Метод открытого класса может быть вызван и выполнен, как только Java обработает определение класса, которому он принадлежит. Это не относится к методу экземпляра. Прежде чем метод общедоступного экземпляра может быть вызван и выполнен, необходимо создать экземпляр того класса, к которому он принадлежит. Чтобы использовать метод открытого класса, вам просто нужен класс. С другой стороны, прежде чем вы сможете использовать метод общедоступного экземпляра, у вас должен быть экземпляр класса.

Способ, которым статический метод вызывается в определении другого метода, зависит от того, принадлежат ли два метода к одному и тому же классу. В приведенном выше примере factorial и main являются методами класса MainClass. В результате вызов factorial в определении main просто ссылается на имя метода «factorial».

Panthy
источник

Ответы:

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
Большое спасибо за примеры кода, которые кажутся знакомыми, так что теперь я понимаю
Panthy
4
@Rohan Еще один хороший способ взглянуть на это: что-либо static(класс, метод или поле) на самом деле ни к чему не принадлежит, оно просто висит в классе для организационных целей.
gobernador
1
кроме того, статические поля используются в качестве объектов данных (один, который содержит данные и, следовательно, не может быть изменен, но вы можете манипулировать данными внутри него). Статические методы могут быть вызваны только для статических полей и отныне несут то же понятие, что они остаются постоянными или не меняются. или не создание экземпляра !!
user2416728
1
@ user2416728 Ваш комментарий очень запутанный. Статические поля можно изменять, но их область действия глобальна для среды выполнения. Следовательно, любой код, имеющий доступ к указанному полю, имеет доступ к тем же данным. Это не эквивалентно тому, что данные остаются постоянными (если не используется модификатор final).
Натаниэль Форд
2
да, "не изменять" >> я имел в виду, что нельзя создать экземпляр !!
user2416728 02
19

Методы и переменные, которые не объявлены как статические, известны как методы экземпляра и переменные экземпляра. Чтобы ссылаться на методы и переменные экземпляра, вы должны сначала создать экземпляр класса, что означает, что вы должны сначала создать объект этого класса. Для статического вам не нужно создавать экземпляр класса u может получить доступ к методам и переменным с именем класса, используя знак точки который в (.)

например:

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

rashedcs
источник
4

Методы экземпляра => вызываются для конкретного экземпляра определенного класса. Метод хочет знать, для какого класса он был вызван. Как это происходит, есть невидимый параметр, называемый «это». Внутри this у нас есть члены класса экземпляра, уже установленные со значениями. «Это» не переменная. Это значение, вы не можете его изменить, и это значение относится к получателю вызова. Пример: вы вызываете ремонтников (метод экземпляра), чтобы починить ваш телевизор (актуальную программу). Он идет с инструментами (параметр «это»). У него есть специальные инструменты, необходимые для ремонта телевизора, и он может исправить и другие вещи.

В статических методах => нет такого понятия, как «это». Пример: Тот же ремонтник (статический метод). При звонке ему необходимо указать, к какому мастеру обращаться (например, к электрику). И он только придет и починит твой телевизор. Но у него нет инструментов для исправления других вещей (нет параметра this).

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

Эльдияр Талантбек
источник
2

Поведение объекта зависит от переменных и методов этого класса. Когда мы создаем класс, мы создаем для него объект. Для статических методов они не требуются, поскольку статические методы означают, что все объекты будут иметь одну и ту же копию, поэтому в объекте нет необходимости. например:

Myclass.get();

В методе экземпляра каждый объект будет иметь разное поведение, поэтому они должны вызывать метод, используя экземпляр объекта. например:

Myclass x = new Myclass();
x.get();
Вишал Патил
источник
1

Если состояние метода не предполагается изменять или он не будет использовать какие-либо переменные экземпляра.

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

Если он работает только с предоставленными ему аргументами.

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

Suketup
источник
1

Короче говоря, статические методы и статические переменные - это уровень класса, тогда как методы экземпляра и переменные экземпляра - это уровень экземпляра или объекта.

Это означает, что всякий раз, когда создается экземпляр или объект (с использованием new 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. Статические методы не могут напрямую обращаться к методам экземпляра и переменным экземпляра. Они должны использовать ссылку на объект. И статический метод не может использовать это ключевое слово, поскольку нет экземпляра, на который можно было бы ссылаться.

парам
источник
-2

При размещении модификатора static перед функцией подразумевается, что существует только одна копия этой функции. Если модификатор static не помещается перед функцией, то для каждого объекта или экземпляра этого класса создается новая копия этой функции. :) То же самое и с переменными.

Пракхар Мохан Шривастава
источник