Diferença entre methods estáticos e methods de instância

Eu estava lendo o texto que me foi dado no meu livro e não tenho certeza se entendi o que está dizendo. Basicamente, está me dizendo que methods estáticos ou methods de class incluem a palavra-chave “modificadora” estática. Mas eu não sei o que isso significa?

Alguém poderia me explicar em termos bem simples quais methods estáticos ou de class são?

Além disso, posso obter uma explicação simples sobre quais são os methods da Instância?

Isto é o que eles me dão no livro:

Existem implicações práticas importantes da presença ou ausência do modificador estático. Um método de class pública pode ser chamado e executado assim que Java processar a definição da class à qual ele 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 invocado e executado, uma instância deve ser criada da class à qual ele pertence. Para usar um método de class pública, você só precisa da class. Por outro lado, antes de poder usar um método de instância pública, você deve ter uma instância da class.

A maneira pela qual um método estático é invocado dentro da definição de outro método varia de acordo com se os dois methods pertencem ou não à mesma class. No exemplo acima, fatorial e main são os dois methods da class MainClass. Como resultado, a invocação de fatorial na definição de main simplesmente faz referência ao nome do método, “fatorial”.

O paradigma básico em Java é que você escreve classs e que essas classs são instanciadas. Objetos instanciados (uma instância de uma class) possuem atributos associados a eles (variables ​​de membro) que afetam seu comportamento; quando a instância tiver seu método executado, ela se referirá a essas variables.

No entanto, todos os objects de um tipo específico podem ter um comportamento que não seja dependente de todas as variables ​​de membro; esses methods são melhor tornados estáticos. Por ser estático, nenhuma instância da class é necessária para executar o método.

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

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

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

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

Em um nível mais profundo, quando o compilador coloca uma class em conjunto, ela contém vários pointers para os methods. Quando esses methods são executados, ele segue os pointers e executa o código no outro extremo. Se uma class é instanciada, o object criado contém um ponteiro para a “tabela de método virtual”, que aponta para os methods a serem chamados para essa class específica na hierarquia de inheritance. No entanto, se o método for estático, nenhuma “tabela de método virtual” será necessária: todas as chamadas para esse método vão para o mesmo local exato na memory 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 estiver dependente de variables ​​de instância.

Métodos e variables ​​que não são declarados como estáticos são conhecidos como methods de instância e variables ​​de instância. Para se referir a methods e variables ​​de instâncias, você deve instanciar a class primeiro significa que você deve criar um object dessa class primeiro.Para estática você não precisa instanciar a class u pode acessar os methods e variables ​​com o nome da class usando sinal de período que está em (.)

por exemplo:

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

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

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

Métodos estáticos, variables ​​pertencem a toda a class, não apenas a uma instância de object. Um método estático, a variável está associada à class como um todo e não a instâncias específicas de uma class. Cada object compartilhará uma cópia comum dos methods estáticos, variables. Há apenas uma cópia por class, independentemente de quantos objects são criados a partir dela.

Métodos de instância => invocados em uma instância específica de uma class específica. O método quer saber em qual class foi invocado. A maneira como isso acontece lá é um parâmetro invisível chamado ‘isso’. Dentro de ‘this’ temos membros da class de instâncias já configurados com valores. ‘Isto’ não é uma variável. É um valor, você não pode alterá-lo e o valor é referência ao receptor da chamada. Ex: Você chama reparadores (método de instância) para consertar sua TV (programa real). Ele vem com ferramentas (parâmetro ‘this’). Ele vem com ferramentas específicas necessárias para consertar a TV e ele pode consertar outras coisas também.

Em methods estáticos => não existe tal coisa como ‘isto’. Ex: O mesmo reparador (método estático). Quando você liga para ele, precisa especificar qual reparador deve chamar (como eletricista). E ele virá e consertará sua TV apenas. Mas ele não tem ferramentas para consertar outras coisas (não existe parâmetro ‘this’).

Os methods estáticos geralmente são úteis para operações que não requerem nenhum dado de uma instância da class (de ‘this’) e podem executar sua finalidade pretendida apenas usando seus argumentos.

Diferença entre methods estáticos e methods de instância

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

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

  3. Método estático significa que existirá como cópia única para uma class. Mas os methods de instância existem como várias cópias, dependendo do número de instâncias criadas para essa class.

  4. Métodos estáticos podem ser chamados usando referência de class. Métodos de instância ou não estáticos são chamados usando referência de object.

  5. Métodos estáticos não podem acessar methods de instância e variables ​​de instância diretamente. O método da instância pode acessar variables ​​estáticas e methods estáticos diretamente.

Referência: geeksforgeeks

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

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

Se ele só funciona em argumentos fornecidos a ele.

Funções utilitárias são boas instâncias de methods estáticos. isto é, math.pow (), esta function não vai mudar o estado para valores diferentes. Então é estático.

O comportamento de um object depende das variables ​​e dos methods dessa class. Quando criamos uma class, criamos um object para ela. Para methods estáticos, não os exigimos como methods estáticos, todos os objects terão a mesma cópia, portanto, não há necessidade de um object. por exemplo:

 Myclass.get(); 

No método da instância, cada object terá um comportamento diferente, portanto, eles precisam chamar o método usando a instância do object. por exemplo:

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

O modificador estático quando colocado na frente de uma function implica que apenas uma cópia dessa function existe. Se o modificador estático não for colocado na frente da function, então, com cada object ou instância dessa class, uma nova cópia dessa function é feita. 🙂 O mesmo acontece com as variables.

Em suma, methods estáticos e variables ​​estáticas são de nível de class, como methods de instância e variables ​​de instância são instância ou nível de object.

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

 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 class, add () retornará a sum dos dados passados ​​por um object específico. Mas o método estático pode ser usado para obter a sum de qualquer class não independente de qualquer instância ou object específico. Portanto, para methods genéricos que só precisam de argumentos para trabalhar, pode ser feito estático para manter tudo em DRY.

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

  1. O método da instância pode acessar os methods da instância e as variables ​​da instância diretamente.

  2. O método da instância pode acessar variables ​​estáticas e methods estáticos diretamente.

  3. Os methods estáticos podem acessar as variables ​​estáticas e os methods estáticos diretamente.

  4. Métodos estáticos não podem acessar methods de instância e variables ​​de instância diretamente. Eles devem usar referência ao object. E o método estático não pode usar essa palavra-chave, pois não há nenhuma instância para a qual se referir.