Estou estudando para certificação com o livro da Kathy, e me deparei com o seguinte codigo:
class Animal {
static void doStuff() {
System.out.print("a ");
}
}
class Dog extends Animal {
static void dostuff() { // it's a redefinition,
// not an override
System.out.print("d ");
}
public static void main(String [] args) {
Animal [] a = {new Animal(), new Dog(), new Animal()};
for(int x = 0; x < a.length; x++)
a[x].doStuff(); // invoke the static method
}
}
E no livro me diz que a saida é a a a, será que alguem pode me explicar por que não é a d a? e O qual é a diferença afinal entre Redefinição e Sobrescrita ?
Supondo que você tenha errado a assinatura dos métodos…
class Animal {
static void doStuff() {
System.out.print("a ");
}
}
class Dog extends Animal {
static void dostuff() { // it's a redefinition,
// not an override
System.out.print("d ");
}
public static void main(String [] args) {
Animal [] a = {new Animal(), new Dog(), new Animal()};
for(int x = 0; x < a.length; x++)
a[x].doStuff(); // invoke the static method
}
}
E a variação da caixa não seja proposital (O java é case-sensitive), então:
Os objetos armazenados em “a” são da classe Animal e os objetos Dog são Animal também. Logo, quando você chama o método a[x].doStuff(); você está chamando o método definido na classe Animal.
Se não fosse static, o método pertenceria ao objeto e não a classe (como é o caso), desta forma o método de Dog sobreescreveria o método de Animal.
Certo?
fw
neoCortex
wagne23:
Estou estudando para certificação com o livro da Kathy, e me deparei com o seguinte codigo:
class Animal {
static void doStuff() {
System.out.print("a ");
}
}
class Dog extends Animal {
static void dostuff() { // it's a redefinition,
// not an override
System.out.print("d ");
}
public static void main(String [] args) {
Animal [] a = {new Animal(), new Dog(), new Animal()};
for(int x = 0; x < a.length; x++)
a[x].doStuff(); // invoke the static method
}
}
E no livro me diz que a saida é a a a, será que alguem pode me explicar por que não é a d a? e O qual é a diferença afinal entre Redefinição e Sobrescrita ?
Obrigado.
Métodos estáticos não podem ser sobrescritos, não existe override, o valor será sempre da Classe Pai más podem sofrer sobrecarga se quizer.
fabim
neoCortex:
wagne23:
Estou estudando para certificação com o livro da Kathy, e me deparei com o seguinte codigo:
class Animal {
static void doStuff() {
System.out.print("a ");
}
}
class Dog extends Animal {
static void dostuff() { // it's a redefinition,
// not an override
System.out.print("d ");
}
public static void main(String [] args) {
Animal [] a = {new Animal(), new Dog(), new Animal()};
for(int x = 0; x < a.length; x++)
a[x].doStuff(); // invoke the static method
}
}
E no livro me diz que a saida é a a a, será que alguem pode me explicar por que não é a d a? e O qual é a diferença afinal entre Redefinição e Sobrescrita ?
Obrigado.
Métodos estáticos não podem ser sobrescritos, não existe override, o valor será sempre da Classe Pai más podem sofrer sobrecarga se quizer.
O metodo invocado sera chamado de acordo com a Referencia.
Se for uma referencia (e nao objeto) de Dog (Dod d), sera chamado o metodo static de Dog.
Nao necessariamente sera sempre de Animal.
Qdo ocorrer o override (nao static), ai sim: de acordo com o objeto instanciado.
B
Bruno_Laturner
fabim:
O metodo invocado sera chamado de acordo com a Referencia.
Se for uma referencia (e nao objeto) de Dog (Dod d), sera chamado o metodo static de Dog.
Nao necessariamente sera sempre de Animal.
Não entendi. Quando não será sempre de Animal neste caso em que declaramos um Animal?
Marcelo_FS
Bruno Laturner:
fabim:
O metodo invocado sera chamado de acordo com a Referencia.
Se for uma referencia (e nao objeto) de Dog (Dod d), sera chamado o metodo static de Dog.
Nao necessariamente sera sempre de Animal.
Não entendi. Quando não será sempre de Animal neste caso em que declaramos um Animal?
Se você tirar o ‘static’ dos métodos. Daí a classe Dog faria um ‘override’ no método de ‘Animal’, e imprimiria ‘a d a’.
Mas este exercício em particular está um pouco mal formulado: método estáticos se acessam pela classe, e não por um objeto dela. Ou seja, o certo seria
publicstaticvoidmain(finalString[]args){finalAnimal[]a={newAnimal(),newDog(),newAnimal()};for(finalAnimalelement:a)Animal.doStuff();// ou Dog.doStuff();}
E não existiria confusão. Do jeito que o código está, o compilador até reclama.
Neste caso sera sempre de animal. Mas perceba que pode causar confusao em quem ler, visto que a pessoa que citou que “Métodos estáticos não podem ser sobrescritos, não existe override, o valor será sempre da Classe Pai más podem sofrer sobrecarga se quizer.” nao explicitou que era nesse exemplo.
Alguem poderia pensar que Dog [] d = {Dog(), new Dog(), new Dog()} executaria o static de Animal.
LPJava
olha so uma dica! isso no inicio eh meio confuso se vc for querer advinhar a resposta baseada no codigo. Se ligue na regra e dai vc encontra a resposta mais facil o que a regra diz?
que static nao sao herdados soa redefinidos
que o metodos nao static sao subscrito.
e quando vc tiver uma referencia para uma subclasse ela so funciona no caso da subscricao
Aa=newB();a.metodo();
so vai chamar metodo se ele foi subscrito na subclasse!
Eu tive que implementar muito e ler N vezes para isso ficar claro e la vai outra dica, estude isso bastante no exame vai aparecer questoes a rodo com essa pegadinha ai, querendo saber o resultado e outras nem compila pq quebra a regra. Eu matei muita questao dela e isso me ajudou pq em outros topicos como api que eh maior decoreba eu nao estava tao seguro. Nos meus resumos que fiz para certifcacacao coloquei N exemplos e expliquei cada um deles com esse assunto se quiser ver dar uma passada no meu blog http://camilolopes.wordpress.com e vai na secao de certificação e veja no post da scjp
flw! abraco e bom estudo
neoCortex
fabim:
Neste caso sera sempre de animal. Mas perceba que pode causar confusao em quem ler, visto que a pessoa que citou que “Métodos estáticos não podem ser sobrescritos, não existe override, o valor será sempre da Classe Pai más podem sofrer sobrecarga se quizer.” nao explicitou que era nesse exemplo.
Alguem poderia pensar que Dog [] d = {Dog(), new Dog(), new Dog()} executaria o static de Animal.
Desculpe acabei me enrolando aqui para responder, na verdade o compilador até chama a atenção nestas situações!!!
Um grande Abraço!!!
Marky.Vasconcelos
Sobre que nem será sempre o do Animal que será chamado é de acordo com a referencia por exemplo: