Herança de Static?

Pessoal todos falam que, não existe herança de membros statics, e sim redefinição, ja li varios topicos aqui sobre isso, mas mesmo assim, estou com duvida porque, olha só:

[code]public class A {

public static void a(){
	System.out.println("teste a");
}

}[/code]

[code]public class B extends A{

 static void a(){
	System.out.println("teste b"); // nao compila
}

}[/code]

Se não estou herdando nada da classe A, deveria compilar não?

Você está reduzindo o nível de acesso de “public” para “default”. Pode ser isso. Deixa tudo public, ou default em A e public em B.

Isso eu sei.

Isso eu sei.[/quote]

e ainda assim quer que compile?

Não entendi sua dúvida…
Se você sabe que realmente não pode compilar?!

E existe sim herança. A classe B possui todos os métodos visivéis da classe A, incluindo o método a()

Cara que nao compila eu sei. Não estou querendo que COMPILE, estou falando que todos falam que nao existe HERANÇA DE METODOS ESTATICOS, e o proprio livro da kathy tambem aborda isso. Se de fato não existe herança e sim redefiniçao, o metodo acima deveria compilar vc nao acha? Pelo fato de nao acontecer polimorfismo com métodos staticos isso é um fato de que nao haja mesmo herança. Outra coisa seria se, para redefinições de métodos staticos, segue-se as mesmas ordens para sobreescritas de métodos herdados.

[quote=joel.amalio]Não entendi sua dúvida…
Se você sabe que realmente não pode compilar?!

E existe sim herança. A classe B possui todos os métodos visivéis da classe A, incluindo o método a()[/quote]

Se vc esta estudando para SCJP deveria saber que nao há herança de staticos. Minha duvida e se realmente métodos staticos, segue as mesmas ordens para sobreescritas de métodos herdados.

Beleza…

Faça o seguinte teste:

Vá na classe B e aperte CTRL + O + O e verá que existe o método para ser usado na classe B.

Mesmo assim se não acreditar que o método existe faça o seguinte teste:

public class B extends A {
	
//	static void a() {
//		System.out.println("B");
//	}

	public static void main(String[] args) {
		B be = new B();
		be.a();
	}
	
}

o método é acessado.
Bem sabemos que os métodos ou as variáveis static o correto é chamar pelo nome da classe e não pelo nome do atributo, mas mesmo assim a JVM trocará isso para você em tempo de execução.

ficaria assim:

public class B extends A {
	
//	static void a() {
//		System.out.println("B");
//	}

	public static void main(String[] args) {
		//B be = new B();
		B.a();
	}
	
}

[/code]

[quote=joel.amalio]Beleza…

Faça o seguinte teste:

Vá na classe B e aperte CTRL + O + O e verá que existe o método para ser usado na classe B.

Mesmo assim se não acreditar que o método existe faça o seguinte teste:

public class B extends A {
	
//	static void a() {
//		System.out.println("B");
//	}

	public static void main(String[] args) {
		B be = new B();
		be.a();
	}
	
}

o método é acessado.
Bem sabemos que os métodos ou as variáveis static o correto é chamar pelo nome da classe e não pelo nome do atributo, mas mesmo assim a JVM trocará isso para você em tempo de execução.

ficaria assim:

public class B extends A {
	
//	static void a() {
//		System.out.println("B");
//	}

	public static void main(String[] args) {
		//B be = new B();
		B.a();
	}
	
}

[/code][/quote]

E nesse caso o método pertence a qual classe? Com certeza á classe A. Faça o mesmo teste com o método “redefinido”.

Da uma olhada aqui tb: http://www.guj.com.br/posts/list/212628.java#1082092

Certo…

acabei de ler esse capítulo tem poucos dias e o livro fala que o atributo “a” é declarado como “A” e instaciado como “B”.

A a; //declarado
a = new B(); //instanciado

Mas para métodos ou atributos static o que vale é a classe que declara… Como eu disse em tempo de execução a linha “be.a();” é substituida por “B.a()”

Isso é uma particularidade do static, faça os testes na sua IDE e comprove… Eu fiz o mesmo, pois meu livro a tradução está muito ruim e com vários problemas então me falaram quando eu tiver dúvida usar a IDE para tirar minhas próprias conclusões…

A idea é essa… qualquer coisa é só falar…

[quote=joel.amalio]Certo…

acabei de ler esse capítulo tem poucos dias e o livro fala que o atributo “a” é declarado como “A” e instaciado como “B”.

A a; //declarado
a = new B(); //instanciado

Mas para métodos ou atributos static o que vale é a classe que declara… Como eu disse em tempo de execução a linha “be.a();” é substituida por “B.a()”

Isso é uma particularidade do static, faça os testes na sua IDE e comprove… Eu fiz o mesmo, pois meu livro a tradução está muito ruim e com vários problemas então me falaram quando eu tiver dúvida usar a IDE para tirar minhas próprias conclusões…

A idea é essa… qualquer coisa é só falar…[/quote]

Sim, provavelmente e o livro da kathy em portugues né? Igual o meu kkk.

Mas de fato, lendo o outro topico, que te passei + o livro. Não ha herança mesmo de static.

É esse livro tem vários erros:

Abre ache (}) a mais ou a menos;
nomes de classes com faltando letras, ou com letras minúsculas no lugar de maiúscula…
linhas de código faltando em relação ao livro para a certificação 1.5

muitos problemas, mas tempos que testar as coisas sempre… hehe… é a melhor maneira de absorver o conteúdo com a maior probabilidade de acertar…

Qual é o tópico que você tá falando?

[quote=joel.amalio]É esse livro tem vários erros:

Abre ache (}) a mais ou a menos;
nomes de classes com faltando letras, ou com letras minúsculas no lugar de maiúscula…
linhas de código faltando em relação ao livro para a certificação 1.5

muitos problemas, mas tempos que testar as coisas sempre… hehe… é a melhor maneira de absorver o conteúdo com a maior probabilidade de acertar…

Qual é o tópico que você tá falando?[/quote]

E lotado de erros mesmo kkk.

Esse aqui: http://www.guj.com.br/posts/list/212628.java#1082092

éverton…
é uma boa pergunta… marquei para acompanhar este tópico…
só algumas coisas…

herança de estático não existe mesmo… o que confunde são coisas como:

class A {
   public static void sayHello() {
      System.out.println( "hello" );
   }
}
class B extends A {
}

public class teste {
   public static void main( String[] args ) {
      B.sayHello();
   }
}

Resultado: hello

o que acontece no código acima é que a JVM faz uma busca na hierarquia da classe e identifica o método sayHello na classe A…
por isso a confusão…

outro detalhe polêmico é a redefinição de métodos estáticos…

class A {
   public static void sayHello() {
      System.out.println( "hello" );
   }
}
class B extends A {
   public static void sayHello() {
      System.out.println( "hello2" );
   }
}

public class teste {
   public static void main( String[] args ) {
      A.sayHello(); // hello
      B.sayHello(); // hello2
      
      A a = new B();
      a.sayHello(); // hello
      ((B)a).sayHello(); // hello2
   }
}

Isso ocorre porque o java deixar um atributo estatico ser acessado apartir de uma instância… (implicitamente ele troca a instância pela classe)…

Mas o problema que você citou, realmente eu não sabia…
se trocarmos o metodo da classe B…

class B extends A {
   static void sayHello() {
      System.out.println( "hello2" );
   }
}

eu poderia querer que o método sayHello da classe B fosse visivel somente ao meu pacote (default) e o metodo sayHello de A fosse publico…
como na teoria, seriam 2 métodos independentes, redefinidos… eu poderia querer este comportamento…
mas… talvez pelo fato da busca hierarquica que a jvm faz… haja alguma limitação…

algo do tipo:

desconheco tal afirmação…
tomara que alguém que tenha uma resposta mais contundente veja o tópico

[]s

Cuidado pessoal: Esse Joel não sabe o que está falando !!!