Gostaria de saber o PORQUE dos metodos e variaveis estaticas nao serem herdadas.
Qual a desvantagem q poderia ocorrer se a JMV aceitasse que metodos estaticos fosse herdados?
Obrigado
Gostaria de saber o PORQUE dos metodos e variaveis estaticas nao serem herdadas.
Qual a desvantagem q poderia ocorrer se a JMV aceitasse que metodos estaticos fosse herdados?
Obrigado
[quote=Arthur.hvt]Gostaria de saber o PORQUE dos metodos e variaveis estaticas nao serem herdadas.
Qual a desvantagem q poderia ocorrer se a JMV aceitasse que metodos estaticos fosse herdados?
Obrigado[/quote]
Não sei se interpretei mal sua pergunta , mas como assin não são herdados !? O exemplo abaixo e verdadeiro !
[code]
public class A {
public static String t = “oi”;
public static void printT() {
System.out.print(A.t);
}
}
public class B extends A {
public static void main(String[] args) {
B.printT(); // herda metodo statico de A
System.out.print(B.t);// herda atributo de A
}
}[/code]
nao, contextos estaticos nao sao herdados.
O que acontece no seu exemplo é que a classe B acessa a variavel e o metodo de diretamente da classe A.
Agora eu só nao sei o porque de nao poder ser herdado, ja que teria sentido em herdar (pelo menos pra mim).
Vamos supor que ele fosse “herdado” como você tá falando…qual seria o nível de acesso de um membro estático que não é mais da classe? por que já temos default, public, protected, private…sugestões???
=> Encare o static como mais um recurso que é muito útil por sinal.
nao entendi o que voce quis dizer…
Porque o metodo estatico nao poderia ser herdado para pertencer a subclasse do mesmo jeito que pertence a superclasse?
Porque nao poderia ser modificado diretamente pela subclasse ser ter necessidade de sobreposiçao?
Variáveis e métodos estáticos são herdados da mesma forma que variáveis e métodos de instância.
O que pode acontecer é quando a classe ou os métodos são marcados como final na classe Pai, então estesnão podem ser herdados.
[quote=Bruno Laturner]
O que pode acontecer é quando a classe ou os métodos são marcados como final na classe Pai, então estesnão podem ser herdados.[/quote]
Uma classe final não pode ser extendida e um metodo final não pode ser sobrescrito!!! Se fosse como você falou para que serviria uma classe não instanciável??? uma classe abstrata não é instanciável, mas isso é outra história!
Porque, por definição, não são membros de objetos. Apenas membros de objetos podem ser herdados.
Se isso acontecesse não existiram métodos estáticos, todos seriam membros de objetos.
A desvantagem é muito grande porque os métodos estáticos , por estarem num nivel diferentes dos de objeto, podem fazer coisas que os de objeto não podem. Sem essa capacidade as funcionaldiades da linguagem Java seriam muito menores e a sua utilidade seria quase nula e/ou os programas seriam muito mais complexos para conseguir os mesmos efeitos.
mas, se eu declarar um metodo numa superclasse e herdar em uma subclasse, o metodo da subclasse sera OUTRO metodo, certo? Nao tera nenhuma ligaçao com o metodo da superclasse, diferente dos metodos estaticos.
Se eu declarar 2 metodos estaticos de mesma assinatura em classes diferentes serao metodos diferentes. Por que com a herança nao posso fazer a subclasse “copiar” o metodo estatico da superclasse e faze-la pertencer a subclasse tambem?
[code]class C {
public void doIt() { System.out.println(“classe C”); }
public static void doItStatic() { System.out.println("[static] classe C"); }
}
class D extends C{
public void doIt() { System.out.println(“classe D”); }
public static void doItStatic() { System.out.println("[static] classe D"); }
}
public class Teste{
public static void main(String [] args){
C c = new C();
D d = new D();
C dc = new D();
System.out.println("C c = new C()");
c.doIt();c.doItStatic();
System.out.println("D d = new D()");
d.doIt();d.doItStatic();
System.out.println("C dc = new D()");
dc.doIt();dc.doItStatic();
}
}[/code]
Produz:
C c = new C()
classe C
[static] classe C
D d = new D()
classe D
[static] classe D
C dc = new D()
classe D
[static] classe C
O que é muito divertido 
Isso acontece porque o metodo static não tem relacionamento com objeto e sim com classe, ou seja nesses casos sempre é levada em consideração a referencia da qual o metodo está sendo chamado.
Uma prova disso é que a seguinte chamada é valida
C dc = null;
dc.doItStatic();
Isso é uma boa pegadinha do tipo SCJP.
[quote=Arthur.hvt]
Se eu declarar 2 metodos estaticos de mesma assinatura em classes diferentes serao metodos diferentes. Por que com a herança nao posso fazer a subclasse “copiar” o metodo estatico da superclasse e faze-la pertencer a subclasse tambem?[/quote]
Porque não é a classe que copia coisas é o objeto. E métodos estáticos, por definição, não pertencem ao objeto.
[quote=rafaelglauber][quote=Bruno Laturner]
O que pode acontecer é quando a classe ou os métodos são marcados como final na classe Pai, então estesnão podem ser herdados.[/quote]
Uma classe final não pode ser extendida e um metodo final não pode ser sobrescrito!!! Se fosse como você falou para que serviria uma classe não instanciável??? uma classe abstrata não é instanciável, mas isso é outra história![/quote]
Instanciar não é sobreescrever, muito menos é estender.
A keyword final faz exatamente o que eu disse acima, mas ela não tem nada a ver com com instanciar classes.
acho que estou entendendo…
Quer dizer que herança é resolvida em tempo de execuçao?
se eu chamar um metodo estatico por uma referencia, a JMV estara modificando diretamente na classe que o objeto se refere? Ou modifica na classe do tipo da referencia?
Se a resposta for sim, acho que consegui pegar 
[quote=Bruno Laturner][quote=rafaelglauber][quote=Bruno Laturner]
O que pode acontecer é quando a classe ou os métodos são marcados como final na classe Pai, então estesnão podem ser herdados.[/quote]
Uma classe final não pode ser extendida e um metodo final não pode ser sobrescrito!!! Se fosse como você falou para que serviria uma classe não instanciável??? uma classe abstrata não é instanciável, mas isso é outra história![/quote]
Instanciar não é sobreescrever, muito menos é estender.
A keyword final faz exatamente o que eu disse acima, mas ela não tem nada a ver com com instanciar classes.[/quote]
dá uma lida aqui: http://ivanqueiroz.wordpress.com/2008/03/30/declaraes-e-modificadores-de-classes-java/
EDIT> veja se você não uma leve confusão com static.
[quote=DaviPiala]Isso acontece porque o metodo static não tem relacionamento com objeto e sim com classe, ou seja nesses casos sempre é levada em consideração a referencia da qual o metodo está sendo chamado.
Uma prova disso é que a seguinte chamada é valida
C dc = null;
dc.doItStatic();
Isso é uma boa pegadinha do tipo SCJP.[/quote]
Gostei dessa pegadinha melhor eu me acostumar, já que pretendo tirar a certificação no meio do ano.
[quote=rafaelglauber]dá uma lida aqui: http://ivanqueiroz.wordpress.com/2008/03/30/declaraes-e-modificadores-de-classes-java/
[/quote]
Já li e já sei disso. Leia novamente:
[quote=Bruno Laturner]
O que pode acontecer é quando a classe ou os métodos são marcados como final na classe Pai, então estes não podem ser herdados.[/quote]
como final eles são herdados 
sobre final:
classe final: A classe não pode ser subclassificada, ou seja, ninguém pode extender ela.
método final: O método não pode ser sobrescrito por uma subclasse.
variável final: A variável não pode receber um valor novo depois de uma atribuição incial.
Qual foi a besteira que eu falei??? Esses conceitos acima foram tirados do livro K&B.
Este foi seu erro rapaz.
metodos finais SÃO herdados, mas nunca sobrescritos.