Como instanciar uma classe em outra?

Olá galera,

Esse é meu primeiro tópico…

Gostaria que me ajudassem em uma dúvida que estou tendo, como que eu consigo usar uma classe em outra??

Tenho as seguintes classes:
package Porta;

[code]public class Porta{
private boolean aberta;
private String cor;
private double dimensaoX, dimensaoY, dimensaoZ;

public void estaAberta ()	{
	if (aberta = true)		{
		System.out.println("A porta está aberta");
	}else		{
		System.out.println("A porta está fechada");
	}
}

public void abre ()	{
	aberta = true;
}

public void fecha()	{
	aberta = false;
}

public void pinta (String s){
	s = this.cor;
}

public String toString(){
	return "\nPorta aberta: "+ aberta+ "\nCor: " + cor + "\nDim x: "+ dimensaoX 
	+"\nDim y: " + dimensaoY + "\nDim z: " + dimensaoZ + "\n";
}

}

package Porta;

public class Casa{
String cor;
boolean aberta;
//aqui estou criando 3 objetos porta
Porta porta1, porta2, porta3;

public void pintaCasa (String s){
	s = this.cor;
}

// Estou com dúvida neste método também
public void abrePorta(int escolher){
	escolher = this.porta1 || porta2 || porta3;
}

boolean portasAbertas(){
	if (porta1 == 1 || porta2 == 1 || porta3 == 1)
	{
		aberta = true;
	}else
	{
		aberta = false;
	}
	return aberta;
}

	
public String toString (){
	return "Cor Casa: " + cor + "\n\nPorta 1: " + porta1 + "\nPorta 2: "
	+ porta2 + "\nPorta 3: " + porta3;
}

}[/code]

Minha dúvida é:
Como utilizo a classe Porta na classe Casa?

Grata

Primeiro:
Edite seu post usando a tag [ code] [/code] para colocar seus códigos …

Antes de mais nada (para ser chato, como me disseram em outro tópico) http://guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor.

Bom, você já “criou” as portas.
Para instanciá-las, basta

porta1 = new Porta();

Simples, não?
Onde colocar isto?
Antes de chamar qualquer método dela…

Simples!

Porta p = new Porta();

Se declarar o objeto sem instanciá-lo, ele terá o valor null

coloca com a tag code.

Esse seu método vai sempre cair no true, pois você está atribuindo “=” o valor true a variável “aberta”

public void estaAberta () { 
if (aberta = true) { 
System.out.println("A porta está aberta"); 
}else { 
System.out.println("A porta está fechada"); 
} 
} 

Altera ele para:

public void estaAberta () { 
if (aberta == true) { 
System.out.println("A porta está aberta"); 
}else { 
System.out.println("A porta está fechada"); 
} 
} 

ou melhor:

public void estaAberta () { 
if (aberta) { 
System.out.println("A porta está aberta"); 
}else { 
System.out.println("A porta está fechada"); 
} 
} 

Só uma curiosidade…

Por que na linha 53 vc verifica dessa maneira?

        if (porta1 == 1 || porta2 == 1 || porta3 == 1)   
        {   
            aberta = true;   
        }else   
        {   
            aberta = false;   
        }   
        return aberta;   

[quote=esdmorais]
Se declarar o objeto sem instanciá-lo, ele será do tipo null[/quote]

É…
Não.
Se declarar o objeto sem instanciá-lo, ele ainda será um objeto do tipo declarado, porém, terá valor nulo.
Sendo assim, se for feita alguma chamada a algum método desse objeto, a JVM lançará uma NullPointerException na linha da chamada.

Eu não sei se entendi errado… mas pra mim estanciar um obejto dentro de outro eu faço isso dentro do contructor…

Isso mesmo! Eu me expressei errado, mas era isso q eu queria dizer rsrs.
Vou editar o post.

Parabéns, leu o post com as dicas e aplicou, isso é muito bom!
Ah, sim, quanto a este método…

[b][i][u][color=red] [/color]// Estou com dúvida neste método também[/b][/i][/u] public void abrePorta(int escolher){ escolher = this.porta1 || porta2 || porta3; }
Se você está usando Swing, pode usar uma JOptionPane e perguntar ao usuário qual porta. Senão, escreva no console e capture a resposta com a classe Scanner

[b][i][u][color=red] [/color]// Estou com dúvida neste método também[/b][/i][/u]  
    public void abrePorta(int escolher){  
        String escolha = javax.swing.JOptionPane.showInputDialog("Qual porta? (1) Porta 1 | (2) Porta 2 | (3) Porta 3");
        int portaSel = Integer.parseInt(escolha);
        if(portaSel == 1){
        escolher = this.porta1;
       }else if(portaSel == 2){
        escolher = this.porta2;
      }else if(portaSel == 3){
        escolher = this.porta3;
      }
       
    }  

Entendeu?

E o setter, serve para que?

Ricardo Passinho
Acho que depende muito do que vai fazer.
Se for necessário que ele seja instanciado somente uma vez, não vejo problema.
Caso esse objeto faça parte de uma iteração em alguma lista ou algo parecido, ai sim teria que ser instanciado a cada passo do laço.

Obrigada pelas dicas galera, já arrumei o tópico :lol:

Acredito que também não me expressei direito!!

Bom o que eu quero é uma dica de como eu posso fazer a classe Porta, ser uma variável da classe Casa?

Isto é, caso seja realmente possível fazer isso neh!!

Minha pergunta vem pois estou lendo a apostila da Caelum para aprender um pouco de Java, pq sou mt ruim em programar :oops: e me deparei em uma situação que isso se tornou necessário e um pouco urgente, mas enfim.

Se puderem me ajudar de alguma forma ou souberem de algum site que fale sobre isso eu agradeço :wink: .

Já fez, nesta linha

Porta porta1, porta2, porta3;

Daí a ter os objetos em memória e tudo mais… É outras história…
Ah, se precisar de ajuda, faz como fez agora que sempre tem quem ajude.

Pra que sua classe Casa contenha atributos porta, tudo o que você precisa é instanciar Porta dentro de Casa:

Porta portaSala = new Porta(); // É boa pratica instanciar cada atributo em uma linha separada

Daí em diante (dentro de um método) é possível chamar qualquer método público de portaSala:

portaSala.abre();

por ex.

Duas coisas:
Nesse seu método de Casa:

public void pintaCasa (String s){   
        s = this.cor;   
    }

Você está fazendo a atribuição ao contrário.

Aconselho a usar um Switch Case neste método:

// Estou com dúvida neste método também   
    public void abrePorta(int escolher){   
        escolher = this.porta1 || porta2 || porta3;   
    }

drsmachado, utilizei o método que vc passou, porém apareceu o problema que eu estou com dúvida.

Comentei nas linhas abaixo:

[code]package Porta;
import javax.swing.*;

public class Casa{
String cor;
boolean aberta;
Porta porta1 = new Porta ();
Porta porta2 = new Porta ();
Porta porta3 = new Porta ();

public void pintaCasa (String s){
	s = this.cor;
}


public void abrePorta(int escolher)
{
	String escolha = javax.swing.JOptionPane.showInputDialog("Qual porta? (1) Porta 1 | (2) Porta 2 | (3) Porta 3");  
	int portaSel = Integer.parseInt(escolha);  
	if(portaSel == 1){  
             //esta linha está dando erro  Type mismatch: cannot convert from Porta to int
	escolher = this.porta1;  
	}else if(portaSel == 2)
	{  
                     //esta linha está dando erro  Type mismatch: cannot convert from Porta to int
		escolher = this.porta2;  
		}else if(portaSel == 3){  
                           //esta linha está dando erro  Type mismatch: cannot convert from Porta to int
		       escolher = this.porta3;  
		}  
	}

	
public String toString (){
	return "Cor Casa: " + cor + "\n\nPorta 1: " + porta1 + "\nPorta 2: "
	+ porta2 + "\nPorta 3: " + porta3;
}

}[/code]


//esta linha está dando erro  Type mismatch: cannot convert from Porta to int   
        escolher = this.porta1;  

Você está tentando atribuir o valor de uma Porta numa variavel do tipo int.

Tente usar uma estrutura Switch Case, vai simplificar muito seu trabalho:


public void abrePorta()   
    {   
        int escolha = Integer.parseInt(JOptionPane.showInputDialog(null, "Qual porta? (1) Porta 1 | (2) Porta 2 | (3) Porta 3"));
        switch(escolha){
		case 1:
			porta1.abrir();
			break;
		case 2:
			[..]//e assim por diante
		default:
			break;
		}       
        } 

De uma olhada na estrutura do Switch

Obrigada pela dica,

Deixei o método dessa forma, mas acredito que não seja a forma correta

public void abrePorta(Porta escolher) { String escolha = JOptionPane.showInputDialog("Qual porta? (1) Porta 1 | (2) Porta 2 | (3) Porta 3"); int portaSel = Integer.parseInt(escolha); if(portaSel == 1){ escolher = this.porta1; }else if(portaSel == 2) { escolher = this.porta2; }else if(portaSel == 3){ escolher = this.porta3; } }

pois, o método main ficando assim fica incorreto

[code]package Porta;

public class TesteCasa
{
public static void main (String args [])
{
Casa c = new Casa ();

	c.cor = "Rosa";

	c.abrePorta(porta1);
	System.out.print(c.toString());
}

}[/code]

Como posso fazer para ficar correto?? :?:

[quote=Kah]Obrigada pela dica,

Deixei o método dessa forma, mas acredito que não seja a forma correta

public void abrePorta(Porta escolher) { String escolha = JOptionPane.showInputDialog("Qual porta? (1) Porta 1 | (2) Porta 2 | (3) Porta 3"); int portaSel = Integer.parseInt(escolha); if(portaSel == 1){ escolher = this.porta1; }else if(portaSel == 2) { escolher = this.porta2; }else if(portaSel == 3){ escolher = this.porta3; } }

pois, o método main ficando assim fica incorreto

[code]package Porta;

public class TesteCasa
{
public static void main (String args [])
{
Casa c = new Casa ();

	c.cor = "Rosa";

	c.abrePorta(porta1);
	System.out.print(c.toString());
}

}[/code]

Como posso fazer para ficar correto?? :?:
[/quote]

Editei meu post anterior. Dá uma olhada =)

O método main deve ser utilizado para criar uma instância, digamos, iniciar o aplicativo.
Todo o resto deverá ser feito em outros métodos.
Ou seja, Você pode criar um método “initApp();” assim

public static void main(String[] args){
 Casa c = new Casa();
 c.initApp();
}

public void initApp(){
 Porta porta1 = new Porta();
 this.cor = "Rosa";
 this.abrePorta(porta1);
  //demais lógicas
}