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");
}
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.
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();
}
}
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”.
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…
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.
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…
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…
é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