Eu nao entendi pq

7 respostas
maxguzenski
class Base {
	protected int size = 100;
	
	public int getSize() {
		return size;
    }
}


public class Runtime extends Base {
	protected int size = 10;
	
	public int getSize(){
		return size;
	}

	public static void main(String[] args) {
		Base b = new Runtime();
		System.out.println (b.size + "," + b.getSize());   
	}
}

7 Respostas

Frank

Será que a resposta é 100,10 ?
Só que eu também não entendi porque …

TaQ

Acho que a solução está no casting de:
Base b = new Runtime();

Quando você cria a Base, ele assume size=100 (a classe a ser construida é uma Base), e quando faz um casting da Runtime para a base, ele pega o método getSize() da Runtime. Aí fica o 100(da Base),10(da getSize()) da Runtime.
Se você declara:

Runtime b = new Runtime();

ele retorna 10,10 pois está acessando o size e o getSize() da Runtime mesmo.
Se você declara:

Base b = new Base();
ele retorna 100,100 pois está acessando o size e getSize() da Base.

Na hora do casting, ele assume o size da Base e o getSize() da Runtime.

Frank

TaQ,
Valeu pela explicação. Agora eu entendi …

Falow.

cv1

“TaQ”:
Acho que a solução está no casting de:
Base b = new Runtime();

Falso ou verdadeiro: podemos concluir que os static initializers da Base é que são rodados quando o construtor de Runtime é chamado?

TaQ

Pode ser que ambos são rodados mas devido à classe criada ser uma Base, ela assume os da base, e sobreescreve as funções da Runtime() por causa do casting.
Seria interessante a gente tentar detalhar como funciona o processo de casting, tipo, se à uma classe “pai” for atribuida uma classe “filho”, como a classe “pai” absorve os métodos e variáveis da “filho”.
E se isso não seria uma prática meio estranha, pois a classe “filho” pode ter vários métodos que a “pai” não tem e não vice-versa.
Esses métodos só seriam acessados com outro casting da classe gerada para o tipo da classe "filho’.
Virge Maria.

TaQ

Deem uma olhada aqui:
http://forum.java.sun.com/thread.jsp?thread=416072&forum=31&message=1837616

TaQ

Outra coisa que eu esqueci de mencionar na minha primeira resposta: não funciona se você fizer:

Runtime b = new Base(); // ao invés de Base b = new Runtime();

Isso pode ser conferido aqui, com um breve trecho abaixo:
http://www.cis.temple.edu/~pwang/223-DS/Lecture/223-0204.htm

If ChildClass extends ParentClass, and child and parent are instances of the two classes, respectively, then the assignment “parent = child;” works, because child is an instance of ParentClass, which is the class of parent. However, the assignment “child = parent;” produces an error, because parent is not an instance of ChildClass, which is the class of child. If the object parent is actually created as an instance of ChildClass or its subclass, then we can cast it into ChildClass, so to get “child = (ChildClass) parent;”. The situation for argument passing is similar.

[]'s

Criado 18 de julho de 2003
Ultima resposta 18 de jul. de 2003
Respostas 7
Participantes 4