Quando um metodo ou atributo é statis significa que ele é pertencente a classe é a não há objetos partculares instanciados da classe dessa forma você pode chama-los pelos nome da classe veja:
NomeClasse.metodoStatico();
V
ViniGodoy
Por que dois métodos estáticos na classe pai e na filha, mesmo que tenham o mesmo nome, são métodos diferentes. Em métodos estáticos, não existe sobrescrita, você acaba com dois métodos em escopos diferentes.
No seu exemplo, existe o método SuperCalc.multiply() e o SubCalc.multiply() e ambos podem ser usados a qualquer momento, por qualquer classe.
P
pablouu
ViniGodoy se o método não é sobrescrito pq eu não posso alterar o modificador de acesso para um mais restritivo??
por ex:
não compila ;~
mesmo não sendo sobrescrito a regra de sobrescrição está sendo aplicada oO
V
ViniGodoy
Acho que isso vc teria que perguntar para o James Gosling. kkkk
Provavelmente por que você pode chamar um método estático de maneira não estática.
E nesse contexto, ele procurará chamar o método mais próximo.
Em todo caso, isso é considerado uma má prática de programação, e chamar métodos estáticos dessa forma não é recomendado desde o Java 1.1, mais ou menos.
T
TiagoTC
Fiz outro teste aqui para ver se métodos estáticos "sobrecarregados" passam pela regra da exceção. Não passa!!!
Me parece que, apesar de não existir sobrescrita de métodos estáticos, todas as regras de sobreescrita são validas... :-o
Cada uma do Java... :lol:
A
adriano_si
Cara… essa foi uma das últimas questões de minha prova hoje… perdi ela por falta de paciência e porque já estava em OFF nessa hora, doido pra sair da sala da prova…
Falows
T
TiagoTC
Outra bizarrice que encontrei. Vejam esses códigos:
Ambos não compilam! Agora, se alguém tiver alguma explicação...
P
peresjuliao
Olá,
Nesse caso você esta tentando fazer uma sobrecarga de um método na subclasse e extende a classe TestA que contém um método static.
Acontece que métodos static não podem serem sobrescritos e muitos menos sobrecarregados.
Por exemplo na API Math seus métodos são static para que você acesse sem precisar de criar instâncias da classe Math.
Pois a classe Math alem de ser final não tem como instância-la.
P
peresjuliao
e um métod static não pode sobrescrever um método não static e vice versa.
Essa é a regra
T
TiagoTC
peresjuliao:
Olá,
Nesse caso você esta tentando fazer uma sobrecarga de um método na subclasse e extende a classe TestA …
Como assim? Eu não estou sobreescrevendo o método? :shock:
P
pmlm
TiagoTC:
Ambos não compilam! Agora, se alguém tiver alguma explicação...
Como já foi dito atrás, métodos estáticos podem ser chamados de forma não estática. Assim, se tiveres:
classTestA{publicvoidstart(){System.out.println("TestA");}}publicclassTestBextendsTestA{publicstaticvoidstart(){System.out.println("TestB");}publicstaticvoidmain(Stringargs[]){TestBb=newTestB();b.start();// o que vai ser chamado aqui?}}
Como é que ele sabe o que deve invocar na linha 10? O método estatico da própria classe (que pode ser chamado assim)? Ou o método da classe pai (seguindo a lógica do objecto)?
T
TiagoTC
pmlm:
TiagoTC:
Ambos não compilam! Agora, se alguém tiver alguma explicação...
Como já foi dito atrás, métodos estáticos podem ser chamados de forma não estática. Assim, se tiveres:
classTestA{publicvoidstart(){System.out.println("TestA");}}publicclassTestBextendsTestA{publicstaticvoidstart(){System.out.println("TestB");}publicstaticvoidmain(Stringargs[]){TestBb=newTestB();b.start();// o que vai ser chamado aqui?}}
Como é que ele sabe o que deve invocar na linha 10? O método estatico da própria classe (que pode ser chamado assim)? Ou o método da classe pai (seguindo a lógica do objecto)?
Esse código não compila.
P
pmlm
Claro que não compila. É o teu código atrás com uma pequena alteração, onde tentei fazer ver porque não compila.