Porque com métodos estáticos o chamado é o mais genérico?
Nesse caso imprime 1 2 1. Chamando nos casos p1 e p3 o método da classe A.
Porém se removermos o static, ele chama da subclasse ficando o resultado 1 2 2.
Poderia me dar uma luz, Nico?
Porque com métodos estáticos o chamado é o mais genérico?
Nesse caso imprime 1 2 1. Chamando nos casos p1 e p3 o método da classe A.
Porém se removermos o static, ele chama da subclasse ficando o resultado 1 2 2.
Poderia me dar uma luz, Nico?
Oi Rafael, neste caso a referência não é o objeto em si, mas sim a classe, lembra? Métodos estáticos são de classe, não pertencem ao objeto em si, apesar de você poder chamar o método pelo objeto, a referência continua sendo a classe.
Faz sentido e isso explica por que o terceiro exemplo exibe 1 com static e 2 sem o static. Por que em um caso a referência é a classe e outro é o objeto.
Pegou a ideia?
Então o que define a classe é o "tipo" da referência (nos casos de static)... e não o que vem depois do new...
Já sem o static é o que vem depois do new que importa... eu entendi o que acontece, mas gostaria de entender o porquê....
Acho que não consegui me expressar bem....
Static são parâmetros e métodos que qualquer "objeto" que olhar para aquela classe vai ter a disposição (considerando que todas são públicas, neste caso) sem precisar criar um objeto.
além disso, o mundo "static", como o nome implica, é estático (imutável). Por isso, pode ser uma fonte de problemas de performance ou mesmo momentos de confusão, já que um parâmetro static é um parâmetro constante.
Oi Rafael, é por que o que é static não pertence ao contexto do objeto, mas sim ao contexto da classe. Você consegue acessar propriedades static no objeto por conveniência, mas não é uma boa prática.
Existe bastante coisa que pode ser usada como argumento pra isso acontecer dessa forma.
Se todos os objetos possuem uma característica comum, por que todos eles deveriam carregar esse valor? Por que não guardar em um lugar único que todos podem acessar?
Aqui podemos citar possíveis sugestões: Menos consumo memória, performance, otimizações, até mesmo a questão de faz "sentido ou não" do ponto conceitual.
Tudo que é declarado como static é comum a todos os objetos, mas a referência do valor é sempre da classe.
O gusrodrigues, tudo bem? static aqui não quer dizer imutável, você pode mudar o valor. Pra ser imutável, ou seja, uma constante, ele precisa ser final: public static final <tipo> <nomeDoAtributo>
o "new B()" define o que afinal?
Essa tá sendo a dúvida... eu entendi que static é da classe e suas finalidades...
a classe é a planta do objeto.
ao criar um objeto, ele é chamado pelo new ConstrutorDaClasse(args);
O new B(), no segundo caso, cria um objeto do tipo B, mas com a referência do tipo A. O que acontece neste caso? Bom, para métodos não estáticos, o compilador vai buscar diretamente no objeto B (caso eles também existam em A). E para métodos estáticos, o lado que importa é o tipo da referência A.
É polimorfismo, você lembra? Posso referenciar um objeto B como A por que B é descendente de A. O inverso eu não posso fazer.
Quando referencio objeto B, como A, eu perco acesso aos métodos específicos da B ( de instância ). Por isso que os métodos precisam ser sobrescritos e terem mesmo nome, etc. Apenas a implementação interna muda.
Mas os métodos são estáticos, então a gente pode esquecer o lado direito do código e ficar só com o esquerdo.
p1 e p2 - vai usar o método de A e B respectivamente, por causa do tipo da referência.
p3 - vai usar usar o método de A, apesar de ser um objeto do tipo B.
Veja bem a diferença: Tipo de objeto e tipo da referência.