Duvida herança

7 respostas
E
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 ?

7 Respostas

G

olhando por cima, voce declarou assim

A a = new B();

eu acho que deveria ser:

B a = new B();

porque da classe b, voce pode pegar os atributos da classe A. Espero que tenho ajudado…
Se não for posta ai de novo.

E

MAs eu estou usando o conceito de herança utilizando polimorfismo …A duvida ainda continua !!!

C

Isso acontece porque o objeto irá escolher o método a ser chamado em tempo de execução, então como o objeto a está referenciando B ele irá chamar o método de B, porém na segunda linha irá imprimir o atributo nome do objeto A.

E

Pq ele imprime do A ?

C

Porque o objeto A não sabe que tem o atributo nome no objeto B, e sim o contrário.

E

Mas o mesmo atributo foi declarado na Classe B…pq dele nao encontrar !?

L

Tá, vou tentar te explicar:

class A {
  String nome;
  String getNome() ...
}

class B {
  String nome;
  String getNome() ... 
}

se vc faz um new A(), vai ser criado um objeto que contém isso na memoria:

  • atributo nome
  • método getNome()

se vc faz um new B(), vai ser criado um objeto que contém isso na memoria:

  • atributo nome (de A)
  • atributo nome (de B)
  • método getNome()

Repare que B tem dois atributos ‘nome’. Tendo uma variavel do tipo A, vc só pode ver/acessar as coisas que o A ve, ou seja, um método ‘getNome’ e o atributo ‘nome’ de A. Quando vc faz A = new B(), vc tah dizendo: “olha, eu to criando um objeto B na memória, mas eu só quero ter acesso as coisas que A pode ver”. Ou seja, vc vai ter acesso ao atributo ‘nome’ de A e ao método ‘getNome’. Na memória vc tem um objeto B que é referenciado por uma variavel do tipo A, esse objeto B vai ter tudo que B possui, inclusive o atributo ‘nome’ de B, mas esse ‘nome’ de B não é acessivel através de uma variavel do tipo A, mas quando vc executa o ‘getNome’, a jvm vai executar o getNome do objeto que esta em memoria, que é um ‘getNome’ que foi sobrescrito em B (e que só pode ser executado porque é um método sobrescrito de A, que A sabe que existe), e esse ‘getNome’ acessa o atributo ‘nome’ de B, que vc não tem acesso diretamente a partir da variavel do tipo A.

Os métodos vc pode sobrescrever, por isso se executar getNome de uma variavel que referencia um objeto do tipo B, ele vai executar o getNome de B, já atributos não podem.

Para vc ver que o que tá na memoria é mesmo um objeto B, experimenta fazer um casting para B da variavel A:

class A {
		public String valor = "A";
	}

	class B extends A {
		public String valor = "B";
	}

	public static void main(String[] args) {
		A a = new B();
		System.out.println(a.valor);
		System.out.println(((B) a).valor);  //aqui mostra o valor de B
	}

ai sim, vc tah acessando o objeto em mémoria através de uma variavel que é do tipo B.

Seu problema é o mesmo que desse tópico, é uma coisa simples, mas parece que muita gente se confunde, e o pior, eu pelo menos acho dificil de explicar de uma forma didática para alguém que tá começando =/

http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=38982

Criado 21 de maio de 2007
Ultima resposta 21 de mai. de 2007
Respostas 7
Participantes 4