Nossa… eu me confundi com essas do static… Fiquei preocupado agora 
Ah, da próxima vez eu coloco a frase inteira! herdados e sobreescritos.
Mas Bruno, um membro final é herdado sim…faça um teste, crie uma classe e coloque nela um metodo final e verá que um objeto dessa classe tem acesso (se vc não tiver colocado private nele)…o que você não poderá fazer é criar uma subclasse que faça uma sobrescrita nesse método…Em se tratando de classe o final tem a função de não deixar a classe ser extendida, ou seja, ninguém conseguiria criar uma outra classe que extenda dessa classe final, mas eu posso sim criar objetos dessa classe que vão ter acesso a todos os membros possíveis (default, public, protected…) da classe supostamente qualificada como final.
e so lembrar tudo que nao for static e private é herdado com extends…
static obviamente tem que ser estatico independente do contexto(Objeto) , entao logo ele nem fica no objeto e sim na classe.
entao se nao ta no objeto ele nao é herdado…
final e so pra impedir de ser sobreescrito, porem nao impede de ser herdado, afinal herança e pra vc reutilizar algo, e algo final pode ser reutilizado por seus filhos.
Static não é um assunto complicado, mas o pessoal está tendo alguma dificuldade, executem o exemplo abaixo:
O método static é herdado!
class A
{
public static void metodo()
{
System.out.println("metodo A");
}
}
class B extends A
{
}
public class ExemploStatic
{
public static void main(String []args)
{
B b = new B();
b.metodo();
B.metodo();
}
}
Alguns detalhes que apoiam a herança de métodos static é que como os métodos normais, não posso reduzir a visibilidade de um método static em uma subclasse.
Isso porque a visibilidade(encare como disponibilidade) dos métodos é dependente da Classe(referência).
Oq muda em relação a metódos normais é que os métodos static são independetes de um objeto.
Um métod static o não faz nem ideia de que a sua referencia tem um objeto associado(Ele leva em consideração a referencia da qual ele foi chamado), segue um exemplo:
class A
{
public static void metodo()
{
System.out.println("metodo A");
}
}
class B extends A
{
public static void metodo()
{
System.out.println("metodo B");
}
}
public class ExemploStatic
{
public static void main(String []args)
{
A a = new B();
a.metodo();
}
}
Tanto que até isso aqui funciona:
A a = null;
a.metodo();
Assim espero que todos tenham entendido o static.
Abraço
DaviPiala…
Eu acho ainda que contextos estaticos NÃO são herdados.
Pra mim, o que acontece no seu primeiro exemplo é que como a JMV nao acha o metodo no escopo da classe B, ele sobe a hierarquia para procurar, e quando encontra o metodo()na classe A, o executa.
Quando voce o chama por uma referencia, a JMV entende que se deve procurar o metodo() diretamente pela classe da referencia, ja que é uma referencia b(nome) do tipo B(classe).
No segundo exemplo, o metodo nao é sobrescrito, e sim sobreposto, pois quando se faz sobreposiçao, se torna IMPOSSIVEL acessar o mesmo metodo() de A(superclasse) pela classe B(subclasse), só se voce chamar diretamente por ele.
Ja me deparei com gente que fala que É herdado, e aqueles que dizem que NÃO são herdados(inclusive autores de livros como Java Como Programar)
a prova…
class ExemploStatic{
public static void main(String []args) {
B b = new B();
b.metodo();
B.metodo();
}
}
class A{
static String a = "Classe A";
public static void metodo() {
System.out.println(a);
}
}
class B extends A{
static String a = "Classe B";
}
Imprime:
Classe A
Classe A
Arthur
Meditei sobre o assunto e cheguei em uma conclusão que realmente não são herdados , pelo seguinte motivo:
-Em uma visão purista um método nunca existe sem um objeto!(Por isso não precisamos ter um objeto, para termos o método). Os métodos static quebram o paradigma OO, isso na minha opinião.
O static é uma opção flexivel que em java nos permite ter esse tipo de coportamento.
Java tem esse comportamente especial com relação com os metodos static, onde uma sub-classe recebe por "shadowing " os métodos static de sua classe base.
Bom exemplo
Eu gostei desse exemplo reforça que a JVM busca pela definição do metodo na hierarquia de classes.
essa facilidade da sun so fez complicar a cabeça de muita gente com relação aos statics, metodo static existem mesmo sem um objeto ter sido instanciado e tambem pode
ser usado sem instanciar objetos…
o static fico meio que sem lugar mesmo e foi parar nas classes,afinal pra onde mais ele poderia ir?
Eu nunca havia meditado tanto sobre static como nesses ultimos dois dias!
Creio que essa conversa foi muito produtiva!
Obrigado a todos!
Na documentação do java tem um exemplo bem legal de static:
Só para entender o MOTIVO disso, eu queria saber:
-
herança é resolvida em tempo de compilação? (ou seja, a subclasse herda as funcionalidades da superclasse quando é compilada?)
-
herança é resolvida em tempo de execução?(ou seja, a subclasse herda as funcionalidades da superclasse quando é criada uma instancia da classe, e os construtores sao chamados e tals…)
Bem, o que eu posso dizer sobre o static é que ele pertence à classe, e não ao objeto.
Isso significaria que objetos sofrem herança, mas classes não? A herança é resolvida em tempo de compilação, mas é aplicada somente aos objetos, que só existem em tempo de execução?
e é exatamente nisso que eu estava pensando :thumbup:
se o objeto é somente uma entidade real da classe, entao a classe tambem tem herança, o comportamento e definido em tempo de compilação,porque ao digitar o código agente já sabe o comportamento esperado para o objeto.
como assim se propagasse para as outras classes? ó.Ó
um metodo estatico pode ser usado em outras classes do mesmo jeito que um metodo comum, a nao ser que seja private
a ainda acho que a herança é resolvida em tempo de execuçao, quando os construtores sao chamados, até a classe Object
sim, esquece oque eu falei so faz confundir mais, quando eu falo em herança eu falo do conceito, se ela fosse decicida somente na execução como você poderia programar a chamada dela ? já que quando vc ta programando você ainda nao compilou entende ?
agora o objeto so herda na execução e claro já que ele nao existe antes da execução…
ps: retiro oque falei sobre os statics
Nao cara… o static nao é herdado…
hahah pior que nos primeiros posts eu falei que nao era mas o codigo abaixo me fez confundir aqui =\
class Static{
public static void doSome(){
System.out.println("static1");
}
}
public class Static2 extends Static {
public static void main(String [] args){
Static2.doSome();
}
}
mas tentei usar a tag @Override e realmente ele nao deixa
entao… O que quero dizer é que metodos estaticos nao sao herdados porque a herança ocorre no objeto, e como contextos estaticos nao fazem parte do objeto…
Correto?