Então ele deveria imprimir o que está definido no método write em Programmer que não é o caso.
D
diego12
Métodos statics são da classe e não do objeto:
abstractclassWriter{publicstaticvoidwrite(){System.out.println("Writing…");}publicstaticvoidwriteChar(charc){System.out.println("Writing… "+c);}}classAuthorextendsWriter{publicstaticvoidwrite(){System.out.println("Writing book");}}publicclassProgrammerextendsWriter{publicstaticvoidwrite(){System.out.println("Writing code");}publicstaticvoidmain(String[]args){Writerw=newProgrammer();w.write();// Writing… (da classe Writer, pois w é do tipo Writer)Programmerp=(Programmer)w;p.write();// Writing code (da classe Programmer, pois p é do tipo Programmer)p.writeChar('A');// Writing… A (da classe Writer, pois Programmer não tem esse método)}}
Se os métodos não fossem statics a saída seria:
WritingcodeWritingcodeWriting…A
W
wldomiciano
O comportamento difere entre métodos de classe e métodos de instancia.
É dito que um método de instancia é sobreescrito (overriding) enquanto que um método de classe é apenas escondido (hiding).
Um método de classe é invocado com base no tipo da variável que o contém.
Um método de intancia é invocado com base no tipo do objeto instanciado nesta variável.
Sendo assim:
classAnimal{publicstaticvoidtestClassMethod(){System.out.println("The static method in Animal");}publicvoidtestInstanceMethod(){System.out.println("The instance method in Animal");}}classCatextendsAnimal{publicstaticvoidtestClassMethod(){System.out.println("The static method in Cat");}publicvoidtestInstanceMethod(){System.out.println("The instance method in Cat");}publicstaticvoidmain(String[]args){CatmyCat=newCat();AnimalmyAnimal=myCat;myAnimal.testClassMethod();// "The static method in Animal"myAnimal.testInstanceMethod();// "The instance method in Cat"// Para invocar o estático de Cat, só com casting((Cat)myAnimal).testClassMethod();// "The static method in Cat"}}
De qualquer forma, é recomendado que ao acessar métodos estáticos, use o nome da classe e não do objeto. Ou seja:
Writer.write();// ouProgrammer.write();
Ao invés de:
newWriter().write();// ounewProgrammer().write();
Obs: Ao postar código, utilize as tags corretas para melhor visualização de todos. Em caso de duvidas, este tópico pode ajudar.