Não sei exatamente o porquê mais isso caiu na minha prova de certificação … Como nunca havia me deparado com essa situação eu chutei que iria imprimir a variável da classe mãe pois seria muito simples caso imprimisse a variável da classe filha … se alguém souber o que acontece eu também gostaria de saber
java_coffe,
no código abaixo: [code]
public static void main(String[] args) {
A a = new B();
System.out.println( a.getNome() );
System.out.println( a.nome ); // acessa a variável de instância "nome" da classe "A"
VAI IMPRIMIR B E DEPOIS VAI IMPRIMIR A
}
[/code]
é impressa a letra “A” a partir do comando System.out.println(a.nome);, porque você acessou o atributo “nome” da classe “A”, já que o objeto “a” é declarado como sendo da classe “A”.
Errei no código que te passei anteriormente, agora também estou da dúvida! :lol:
[ ]
Mas por que é garantido apenas o acesso aos métodos de B e não aos atributos de B ? Esta é a questão!
A que se deve isso ? To curioso agora :shock:
Métodos são substituídos (override), variáveis não.
[quote=adriano.ferranti]Métodos são substituídos (override), variáveis não.
[/quote]
Alguém já fez o teste? Isso está na especificação?
[quote=luidhi][quote=adriano.ferranti]Métodos são substituídos (override), variáveis não.
[/quote]
Alguém já fez o teste? Isso está na especificação? [/quote]
Especificação? Isso não é relativo a Java, mas à OO
[quote=luidhi][quote=adriano.ferranti]Métodos são substituídos (override), variáveis não.
[/quote]
Alguém já fez o teste? Isso está na especificação? [/quote]
Especificação? Isso não é relativo à Java, mas à OO.
mais um curioso… :lol:
Nao consegui entender…
[]'s
Geraldo Barboza
[quote=adriano.ferranti]Métodos são substituídos (override), variáveis não.
[/quote]
COmo o adriano.ferranti disse isso é conceito de O.O pessoal !!!
Boa tarde galera…
Estava eu e meu amigo Camilo comentando sobre este assunto e ele me lembrou…
Somente metodos sao subscritos e recebem o valor do objeto criado.
Variaveis de instancias nao sao subscritas:
class B extends A{
String a = "B";
}
Matodo main
A a = new B();
Sytem.out.println(a);
A variavel a é do tipo A mas o objeto criado é B,…
E como eu disse antes…Subscricao sao apenas para metodos se vc chamar a variavel de referencia ela vai pegar do tipo…Neste caso imprime “A” porque ele pega o tipo e nao o Objeto…O tipo é da classe A e o objeto é B…
Ate mais… Espero ter ajudado
Vamos lá então pessoal…
Na classe B quando nosso amigo omaisnormalbaba, cria o atributo,
String nome = "B"
A JVM entende que é um novo atributo, pessoal não existe sobrecarga nem sobreescrita de atributo, só de método.
Por isso que quando você chamar
a.getNome()
ele está retornando o atributo que você criou na classe B, mas porque fazer isso, se ele já está herdando nome da classe A???
Porque ele retorna o atributo da classe B??? Porque houve sobreescrita de método, então você está chamando o getNome() de B correto!!!..E isto ocorre em tempo de execução, mas porque então na hora de vc imprimir a.nome ele retorna A??!! Porque isso ocorre em tempo de compilação, a referência tipada a é do tipo A e não B, por isso ele só consegue ler a String de A!!!
Pessoal isso tem no livro da Kathy Sierra!!..
Se não ficou claro posta ai que a gente resolve!!!
public class A {
String nome = "A";
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
public class B extends A {
String nome= "B" ;
public String getNome() {
return this.nome ;
}
public void setNome(String nome) {
this.nome = nome ;
}
public static void main(String[] args) {
A a = new B();
System.out.println( a.getNome() );
System.out.println( a.nome );
VAI IMPRIMIR B E DEPOIS VAI IMPRIMIR A
}
}
Gente pq não imprime o B novamente quando eu acesso diretamente pelo atributo(a.nome) . Pois o próprio atributo esta sendo declarado na propria subclasse tambem ?
Acho que geriu polemica :lol: …Muito bom isso !!!
Espero que alguem possa sanar essa duvida pro pessoal do forum …
Caiu na prova de certificação .
Conceirto de OO é …Mas tem que explicar o motivo !