Classes Abstratas!

Galera, pode parecer o tipico tópico de quem não procurou por informação, mas a situação é diferente :smiley:

eu estou lendo o livro: Use a Cabeça! JAVA. e comecei a estudar classes abstratas. Dae não entendi :shock: então fui tentar usar ela pra ver se ajudava, mas quando uso ela é inutil!

da uma olhada no código que pensei:

abstract class pessoa{
	String nome;
	int telefone;
	int idade;
	boolean telefonando = false;
	boolean receb_telefon = false;
	boolean dirigindo = false;
	
	void condicao(){
		if (dirigindo == true){
			receb_telefon =false;
		}
		else{
			receb_telefon = true;
		}
	}
	
}

class maria extends pessoa{
	
	 nome = "Maria";
	 idade= 32;
	 telefone = 25;
}

não posso simplesmente “puxar” o nome pra adicionar maria? ou tem que sobrescrever o código?

pra que server realmente o abstract??

Não entendi muito bem essa Classe Maria. Se você quer um Objeto com o nome Maria, o nome da classe não precisa ser Maria. A idéia da classe abstrata é ter métodos e atributos genéricos que podem ser usados em diversas outras classes com o mesmo gênero. Por exemplo, no seu código, toda pessoa tem (nome, telefone, idade … ), se você for criar tipos mais específicos de pessoas, você dá um extends Pessoa e coloca os atributos/métodos mais específicos. Por exemplo, se for um Atendente, teoricamente um Atendente é uma Pessoa. Logo, ele tem “tudo” o que uma Pessoa tem, e pode fazer “tudo” que uma pessoa pode fazer também. Sendo assim, você não precisa copiar os atributos/métodos em todas as classes específicas. Já pensou você colocar String nome, int telefone, int idade em todas as classes ? :confused:

uhm… é verdade…

o Maria no contexto era somente um exemplo… :smiley:
mass…
e se eu quisesse fazer algum método dentro da classe maria?
eu não posso buscar os atributos que estão na classe abstrata pois não posso estancia-la certo?

quer dizer então que a classe “Maria” apenas server para “reter” os valores que criei na classe abstrata?
e só posso acessa-los mediante a inicialização do main em outra classe?

Quando você der um extends Pessoa, você vai receber todos atributos e métodos que tem na classe Pessoa (que são public ou protected ou default se estiverem no mesmo pacote). Vamos a um exemplo:

[code]abstract class pessoa{
String nome;
int telefone;
int idade;
boolean telefonando = false;
boolean receb_telefon = false;
boolean dirigindo = false;

void condicao(){
	if (dirigindo == true){
		receb_telefon =false;
	}
	else{
		receb_telefon = true;
	}
}

}[/code]
Se você quer acessar os atributos nome, idade, telefone, você cria métodos publicos para acesso dentro da classe Pessoa:

[code]public String getNome() {
return this.nome;
}

public int getIdade() {
return this.idade;
}[/code]
Assim, na sua classe “Maria”, quando você der um maria.getNome(); a idéia é retornar a string “Maria”. Mas claro, se você setar antes! Tente setar sempre dentro de métodos set’s e não diretamente como você fez.

isso não é o tão falado “encapsulamento”?

bah valeu ia ficar tentando o dia todo :smiley:

Acho que o exemplo do livro tá complicando mesmo. Ele confundo a relação Classe Abstrata e Concreta com a relação Classse e Objeto (instância da classe).

Pessoa e Maria é mais um bom exemplo pro segundo caso, daí a sua confusão.

Sua classe vai ser abstrata quando precisar ela representar uma idéia que nunca vai ser concreta, uma idéia mais genérica. Por exemplo, na prática você não tem opção de conta, e sim Conta-corrente ou poupança. Assim, Você criar uma classe Conta, que nunca vai ter uma instância real (objeto) e, portanto, vai ser Abstrata, e duas classes filhas concretas que extendam-na. Essas sim vão ter instâncias: conta-corrente da maria, número 123, agência 21.

E continuando sua jornada você vai aprender a programar orientando-se mais para interfaces…

Espero não ter superado o livro em complicar a idéia. :slight_smile:

Fugindo um pouco do assunto, gostei da sua assinatura ozix.

Pois é ozix, eu criei pessoa como algo genérico, já que Maria É-UMA pessoa, é uma relação, como na sua conta…
no meu caso então seria um que poderia ser usado como abstract :slight_smile: