Porque contextos estaticos nao sao herdados?

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 :slight_smile:

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 :wink:

[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 :wink:

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.