Diferença entre métodos estáticos e métodos de instância

89

Eu estava lendo o texto que me foi dado no meu livro e não tenho certeza se entendi o que ele está dizendo. Basicamente, está me dizendo que os métodos estáticos ou métodos de classe incluem a palavra-chave "modificador" estática. Mas eu realmente não sei o que isso significa.

Alguém poderia me explicar em termos realmente simples o que são métodos estáticos ou de classe?

Além disso, posso obter uma explicação simples sobre o que são métodos de instância?

Isso é o que eles me dão no livro didático:

Existem implicações práticas importantes da presença ou ausência do modificador estático. Um método de classe pública pode ser chamado e executado assim que o Java processa a definição da classe à qual pertence. Esse não é o caso de um método de instância. Antes que um método de instância pública possa ser chamado e executado, uma instância deve ser criada da classe à qual ele pertence. Para usar um método de classe pública, você só precisa da classe. Por outro lado, antes de usar um método de instância pública, você deve ter uma instância da classe.

A maneira como um método estático é chamado dentro da definição de outro método varia de acordo com se os dois métodos pertencem ou não à mesma classe. No exemplo acima, fatorial e principal são métodos da classe MainClass. Como resultado, a invocação de fatorial na definição de principal simplesmente faz referência ao nome do método, "fatorial".

Panthy
fonte

Respostas:

166

O paradigma básico em Java é que você escreve classes e que essas classes são instanciadas. Objetos instanciados (uma instância de uma classe) têm atributos associados a eles (variáveis ​​de membro) que afetam seu comportamento; quando a instância tiver seu método executado, ela fará referência a essas variáveis.

No entanto, todos os objetos de um tipo específico podem ter um comportamento que não depende de nenhuma variável de membro; esses métodos são mais bem tornados estáticos. Por ser estático, nenhuma instância da classe é necessária para executar o método.

Você pode fazer isso para executar um método estático:

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

Mas para executar um método não estático, você deve fazer o seguinte:

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

Em um nível mais profundo, o compilador, quando reúne uma classe, coleta ponteiros para métodos e os anexa à classe. Quando esses métodos são executados, ele segue os ponteiros e executa o código na extremidade oposta. Se uma classe é instanciada, o objeto criado contém um ponteiro para a "tabela de método virtual", que aponta para os métodos a serem chamados para aquela classe particular na hierarquia de herança. No entanto, se o método for estático, nenhuma "tabela de método virtual" é necessária: todas as chamadas para esse método vão para o mesmo lugar na memória para executar exatamente o mesmo código. Por esse motivo, em sistemas de alto desempenho, é melhor usar um método estático se você não depende de variáveis ​​de instância.

Nathaniel Ford
fonte
2
muito obrigado pelos exemplos de código que parecem familiares, então eu entendo agora
Panthy
4
@Rohan Outra boa maneira de ver isso é que nada static(uma classe, método ou campo) realmente não pertence a nada, apenas fica na classe para fins organizacionais.
governador de
1
além disso, os campos estáticos são usados ​​como objetos de dados (um que mantém os dados e, portanto, não pode mudar, mas você pode manipular os dados dentro dele). Os métodos estáticos só podem ser chamados em campos estáticos e, a partir de então, carregam a mesma noção de permanecer constante ou não mudar ou não instanciando !!
user2416728
1
@ user2416728 Seu comentário é muito confuso. Os campos estáticos podem ser alterados, mas seu escopo é global para seu ambiente de execução. Portanto, qualquer código que tenha acesso ao referido campo tem acesso aos mesmos dados. Isso não é equivalente a esses dados permanecerem constantes (a menos que um modificador 'final' seja usado).
Nathaniel Ford
2
sim, "não muda" >> eu quis dizer não pode ser instanciado !!
user2416728
19

Métodos e variáveis ​​que não são declarados como estáticos são conhecidos como métodos de instância e variáveis ​​de instância. Para se referir a métodos e variáveis ​​de instância, você deve instanciar a classe primeiro significa que você deve criar um objeto dessa classe primeiro. Para estático você não precisa instanciar a classe u pode acessar os métodos e variáveis ​​com o nome da classe usando o sinal de ponto que está em (.)

por exemplo:

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

para o método não estático, você deve instanciar a classe.

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.
Khalid Ahmed Khichi
fonte
8

Métodos estáticos, variáveis ​​pertencem a toda a classe, não apenas a uma instância de objeto. Um método estático, a variável é associada à classe como um todo, e não a instâncias específicas de uma classe. Cada objeto compartilhará uma cópia comum dos métodos estáticos, variáveis. Existe apenas uma cópia por classe, não importa quantos objetos sejam criados a partir dela.

Paulius Matulionis
fonte
8

Diferença entre métodos estáticos e métodos de instância

  1. Método de instância são métodos que requerem que um objeto de sua classe seja criado antes de ser chamado. Os métodos estáticos são os métodos em Java que podem ser chamados sem criar um objeto de classe.

  2. O método estático é declarado com a palavra-chave static. O método de instância não é com palavra-chave estática.

  3. Método estático significa que existirá como uma única cópia para uma classe. Mas os métodos de instância existem como cópias múltiplas, dependendo do número de instâncias criadas para aquela classe.

  4. Os métodos estáticos podem ser chamados usando a referência de classe. Métodos de instância ou não estáticos são chamados usando referência de objeto.

  5. Os métodos estáticos não podem acessar métodos e variáveis ​​de instância diretamente. O método de instância pode acessar variáveis ​​estáticas e métodos estáticos diretamente.

Referência: geeksforgeeks

erupções cutâneas
fonte
4

Métodos de instância => invocados em uma instância específica de uma classe específica. O método deseja saber em qual classe foi invocado. Do jeito que isso acontece, há um parâmetro invisível chamado 'this'. Dentro de 'this', temos membros da classe de instância já configurados com valores. 'Isso' não é uma variável. É um valor, você não pode alterá-lo e o valor é uma referência para o receptor da chamada. Ex: você chama reparadores (método de instância) para consertar sua TV (programa real). Ele vem com ferramentas (parâmetro 'este'). Ele vem com ferramentas específicas necessárias para consertar a TV e também pode consertar outras coisas.

Em métodos estáticos => não existe algo como 'isto'. Ex: O mesmo reparador (método estático). Ao ligar para ele, você deve especificar para qual técnico ligar (como um eletricista). E ele virá consertar apenas sua TV. Mas ele não tem ferramentas para consertar outras coisas (não há parâmetro 'este').

Os métodos estáticos são geralmente úteis para operações que não requerem nenhum dado de uma instância da classe (de 'this') e podem realizar sua finalidade pretendida apenas usando seus argumentos.

Eldiyar Talantbek
fonte
2

O comportamento de um objeto depende das variáveis ​​e dos métodos dessa classe. Quando criamos uma classe, criamos um objeto para ela. Para métodos estáticos, não os exigimos, pois métodos estáticos significam que todos os objetos terão a mesma cópia, portanto, não há necessidade de um objeto. por exemplo:

Myclass.get();

No método de instância, cada objeto terá um comportamento diferente, então eles devem chamar o método usando a instância do objeto. por exemplo:

Myclass x = new Myclass();
x.get();
Vishal Patil
fonte
1

Se o estado de um método não deve ser alterado ou ele não vai usar nenhuma variável de instância.

Você deseja chamar o método sem instância.

Se funcionar apenas com os argumentos fornecidos a ele.

As funções utilitárias são um bom exemplo de métodos estáticos. ie math.pow (), esta função não vai mudar o estado para diferentes valores. Portanto, é estático.

suketup
fonte
1

Em suma, os métodos estáticos e as variáveis ​​estáticas são de nível de classe, enquanto os métodos de instância e as variáveis ​​de instância são de instância ou de objeto.

Isso significa que sempre que uma instância ou objeto (usando new ClassName ()) é criado, esse objeto manterá sua própria cópia das variáveis ​​da instância. Se você tiver cinco objetos diferentes da mesma classe, terá cinco cópias diferentes das variáveis ​​de instância. Mas as variáveis ​​e métodos estáticos serão os mesmos para todos esses cinco objetos. Se você precisa de algo comum para ser usado por cada objeto criado, torne-o estático. Se você precisa de um método que não precisa de dados específicos do objeto para funcionar, torne-o estático. O método estático só funcionará com a variável estática ou retornará dados com base nos argumentos passados.

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

No exemplo acima, quando você chama add () como:

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

Na primeira classe, add () retornará a soma dos dados passados ​​por um objeto específico. Mas o método estático pode ser usado para obter a soma de qualquer classe, não independente de qualquer instância ou objeto específico. Portanto, para métodos genéricos que precisam apenas de argumentos para funcionar, eles podem ser tornados estáticos para mantê-los todos DRY.

Prakash
fonte
0

Método de instância vs método estático

  1. O método de instância pode acessar os métodos de instância e variáveis ​​de instância diretamente.

  2. O método de instância pode acessar variáveis ​​estáticas e métodos estáticos diretamente.

  3. Os métodos estáticos podem acessar as variáveis ​​estáticas e os métodos estáticos diretamente.

  4. Os métodos estáticos não podem acessar métodos e variáveis ​​de instância diretamente. Eles devem usar referência ao objeto. E o método estático não pode usar essa palavra-chave, pois não há instância para 'this' para se referir.

param
fonte
-2

O modificador estático, quando colocado na frente de uma função, implica que existe apenas uma cópia dessa função. Se o modificador estático não for colocado na frente da função, com cada objeto ou instância dessa classe, uma nova cópia dessa função será feita. :) O mesmo acontece com as variáveis.

Prakhar Mohan Srivastava
fonte