Dúvida com arrays

23 respostas
peresjuliao

Tenho as seguintes classes:

class Funcionario
{
	String nome;
	String departamento;
	double salario;
	String rg;
	boolean estaNaEmpresa;
	Data dataDeEntrada;
	
	void bonifica(double aumento)
	{
		this.salario += aumento;
	}
	
	void demite()
	{
		this.estaNaEmpresa = false;
	}
	
	void mostra()
	{
		System.out.println("Nome: " + this.nome);
		System.out.println("Departamento: " + this.departamento);
		System.out.println("Salario: " + this.salario);
		System.out.println("Data de Entrada: " + this.dataDeEntrada.dia + "/" + this.dataDeEntrada.mes + 
		"/" + this.dataDeEntrada.ano);
		System.out.println("RG: " + this.rg);
		System.out.print("Esta na Empresa: ");
		if(estaNaEmpresa)
		{
			System.out.println("Sim");
		}
		else
		{
			System.out.println("Nao");
		}
	
		//System.out.println("Esta na Empresa: " + this.estaNaEmpresa);
	}
}
class Empresa
{
	String nome;
	Funcionario[] funcionarios;
	String cnpj;
	
	void adiciona(Funcionario f, int [] array)
	{
		for(int i: array)
		{
			this.funcionarios[i] = f;	
		}
			
	}
}
E a classe main
class EmpresaTestDrive
{
	public static void main(String [] args)
	{
		Empresa empresa = new Empresa();
		empresa.funcionarios = new Funcionario[10];
		Funcionario f1 = new Funcionario();
		f1.nome = "Peres";	
		
	}
}

Como faço para acessar os atributos e métodos da classe Funcioario?

23 Respostas

Andre_Brito

Pra acessar os métodos, estes devem ser public.
Pra acessar as variáveis, você deve retornar a variável no método.

public double getSalario() {
   return salario;
}

Abraço.

gilmaslima
public static void main(String [] args)  
        {  
            Empresa empresa = new Empresa();  
            empresa.funcionarios = new Funcionario[10];   // aqui vc só instanciou o array e definiu o tamanho (10 funcionários)
            Funcionario f1 = new Funcionario();  // criou uma instancia de funcionário 
            f1.nome = "Peres";    // atrinuiu o nome a variavel de refenecia f1

            empresa.funcionarios[0] = f1;

            System.out.println(empresa.funcionarios[0].nome); // a saída será "Peres"
              
       }
dionat4n

Precisam estar no mesmo pacote.

Coloque na primeira linha em cada arquivo da classe o nome do pacote:
“package pacoteTal;”

Assim todas as suas classes vão se enxergar.

Obs.: A acesso das tuas classes estão sem modificador de acesso, então por padrão são as classes de dentro do pacote se enxergarão.

peresjuliao

E como eu faço para que o objeto que esta dentro do array acessar o método mostra() da classe Funcionario?

thegoergen
empresa.funcionarios[0].mostra()
peresjuliao

Então pessoal estou tentanto resolver um exercício da apostlia FJ-11 da Caelum na página 52 Exercicios com Arrays

O seguinte problema:

2) A empresa deve ter um método adiciona, que recebe uma referência a Funcionario como argumento, e
guarda esse funcionário. Algo como:

void adiciona(Funcionario f) {
// algo tipo: this.funcionarios[ ??? ] = f
// mas que posição colocar?
}

Você deve inserir o Funcionario em uma posição da array que esteja livre. Existem várias maneiras para
você fazer isso: guardar um contador para indicar qual a próxima posição vazia ou procurar por uma posição
vazia toda vez. O que seria mais interessante?
É importante reparar que o método adiciona não recebe nome, rg, salário, etc. Essa seria uma maneira nem
um pouco estruturada, muito menos orientada a objetos de se trabalhar. Você antes cria um Funcionario e
já passa a referência dele, que dentro do objeto possui rg, salário, etc.

Ai fiz o seguinte na classe main:

class EmpresaTestDrive
{
	public static void main(String [] args)
	{
		Empresa empresa = new Empresa();
		empresa.funcionarios = new Funcionario[10];
		Funcionario f1 = new Funcionario();
		Data data = new Data();
		f1.dataDeEntrada = data;
		empresa.funcionarios[0] = f1;
		empresa.funcionarios[0].nome = "Peres";
		empresa.funcionarios[0].departamento = "Contabil";
		empresa.funcionarios[0].salario = 1000;
		empresa.funcionarios[0].dataDeEntrada.dia = 20;
		empresa.funcionarios[0].dataDeEntrada.mes = 12;
		empresa.funcionarios[0].dataDeEntrada.ano = 2008;
		empresa.funcionarios[0].rg = "123456789";
		empresa.funcionarios[0].estaNaEmpresa = true;		
		empresa.funcionarios[0].mostra();
              // Como eu uso o método adiciona???? sei que é algo empresa.adiciona(.....
	}
}
Mas como o meu método deve receber isto? Pode ser algo mais ou menos parecido com isso?
class Empresa
{
	String nome;
	Funcionario[] funcionarios;
	String cnpj;
	
	void adiciona(Funcionario f, int [] array)
	{
		for(int i: array)
		{
			this.funcionarios[i] = f;	
		}
			
	} 
}

Este método esta mais ou menos certo? Quero que este método adiciona execute, alguém pode me ajudar?

rmendes08

Muito pelo contrário. É justamente assim que se trabalha em orientação a objetos! Você cria um Funcionario, define os valores de seus atributos e aí você passa a referência para o método. Dessa maneira, o seu método adiciona não depende da implementação da sua classe Funcionario. Vamos supor que a sua classe tenha os atributos nome e rg. Se você instanciar o objeto no método adiciona. A assinatura seria assim adiciona( nome , rg ). Se a sua classe mudar (o que acontece com freqüência ), e ganhe mais um atributo, endereco por exemplo, você tem que alterar a assinatura do seu método para adiciona( nome , rg , endereco ), além de ter que refatorar todo código que usa esse método, além da implementação, é claro.

Aí você diz: “Ah , ao invés de refatorar, eu crio uma sobrecarga”. Assim, você decide manter duas versões de um método tão simples no seu sistema, adiciona( nome , rg , endereco ) e adiciona( nome , rg ){ adiciona( nome, rg, “” ) }. Pronto, você conseguiu f$@#@$ o seu sistema! Provavelmente, isso vai lhe render uma boa noite de sexta-feira arrumando gambiarras, enquanto que o seu colega que escreveu simplesmente calculaSalario( Funcionario f ) está no happy hour! :lol:

peresjuliao

Olá Pessoal,

Estou com dificuldades no método aciona que recebe uma referência a Funcionario como argumento, e guarda esse funcionário. O Exercício da apostila da caelum da uma luz de como seja e diz assim algo como:

...
void adiciona(Funcionario f) {
// algo tipo: this.funcionarios[ ??? ] = f
// mas que posição colocar?
}
...

No método adiciona eu devo inserir o Funcionario em uma posição da array que eseja livre. Para inserir eu faço da seguinte maneira:

1º (guardar um contador para indicar qual proxima posição vazia) ou
2º (procurar por uma posição vazia toda vez)

Alguém pode me ajudar a fazer a 1º ou a 2º opção?
Já tentei várias tentativas e não consegui revolver este problema.

rmendes08

Bem, já que estamos em um mundo OO, eu acho que é interessante criar uma classe apenas para armazenar o array e contador:

class ArrayFuncionario{
    private Funcionario arrayFuncionario[];
    private int proximaPosicaoLivre = 0;
}

E aí você implementa o método adiciona nessa classe. Fica como exercício também você fazer o construtor dessa classe. A dica que fica é que você deve conhecer o tamanho do array antes de instanciar um objeto dessa classe. Conforme você adiciona funcionários você vai incrementando o contador e sempre inserindo na última posição livre. Flw

peresjuliao

Olá rmendes08?

Obrigado por ter a paciência de estar me ajudando, para não complicar pois estou engatinhando na OO fiquei muito
confuso em estar criando uma nova classe. Decidi pegar somente a váriavel proximaPosicaoLivre e adiciona-la ao meu método acicionar veja como ficou:

class Empresa
{
	String nome;
	Funcionario[] funcionarios;
	String cnpj;
	int proximaPosicaoLivre = 0;
	
	 void adiciona(Funcionario f)  
     {  
        this.funcionarios[proximaPosicaoLivre] = f; 
        proximaPosicaoLivre++;      
               
     }   
}

Fica certo dessa forma?

Abraços

rmendes08

Faltou você instanciar o array.

peresjuliao

Como assim instaciar o array?

rmendes08

Arrays são como objetos. Eles devem ser criados (instanciados) com o operador new. Nesse momento, você informa o comprimento do array.

samea

Oi pessoal eu tenho um programonha pra ler no banco de dado oracle
os registros de tres tabelas e depois jogar o resutado na janela
dentro de TextArea, ate ai tudo bem o problema eh que agora eu
tenho que acrescentar zeros a esquerda dos numeros das tabelas de numeros
ate completar oito digitos para alinhar bem todos os registros!
Alguem ai sabem como eu posso fazer isso?
Esse ai eh o codigo eu so quero:
package teste;

public class Tentativa extends JFrame implements ActionListener {

private String Drive = "oracle.jdbc.OracleDriver";                                             
private String URL= "endereco do banco de dados oracle";                             
private String USARNAME = "usuario";                                                               
private String PASSWORD = "senha";                                                               
private Connection conn;                                                                       
                                                                                               
private JTextArea       TxtArquivo;                                                            
private JFileChooser    Arquivo;                                                               
private JButton         CmdEscolher, CmdSalvar;                                                
private JButton         Cmdconsulta; // declarando o novo botao para consulta no banco         
private JScrollPane     js;                                                                    
                                                                                               
private void setCenter(JFrame frame) {                                                         
                                                                                                                                                                                      //51
	Dimension paneSize      = frame.getSize();                                                 
	Dimension screenSize    = frame.getToolkit().getScreenSize();                              
	frame.setLocation( (screenSize.width - paneSize.width) / 2, (screenSize.height - paneSize.height) / 2);

}

public Tentativa(){

try{                                                                                       
    	Class.forName(this.Drive);                                                             
    	this.conn = DriverManager.getConnection(URL, USARNAME, PASSWORD);                      
                                                                                               
	} catch (ClassNotFoundException e){                                                        
        System.out.println("Não foi possivel encontrar o driver de banco: " + e.getMessage()); 
    } catch(SQLException e){                                                                   
        System.out.println("Erro ao conectar com o banco: " + e.getMessage());                 
    }                                                                                          
                                                                                               
	setSize(400, 450);                                                                         
    setResizable(false);                                                                       
    setTitle("Abrindo um arquivo TXT");                                                        
    setCenter(this);                                                                           
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                                            
                                                                                               
    Container cp = getContentPane();                                                           
    cp.setLayout(null);                                                                        
                                                                                               
    Arquivo     = new JFileChooser(".");                                                       

    CmdSalvar = new JButton("Salvar arquivo");
    CmdSalvar.setBounds(50,10,140,25);
    CmdSalvar.addActionListener(this);
    cp.add(CmdSalvar);

    CmdEscolher = new JButton("Escolher arquivo");
    CmdEscolher.setBounds(200,10,140,25);
    CmdEscolher.addActionListener(this);
    cp.add(CmdEscolher);
    
    
    //botao para consultar no banco de dados
    
    Cmdconsulta = new JButton ("Consulta no Banco");
    Cmdconsulta.setBounds(120, 350, 140, 25);
    Cmdconsulta.addActionListener(this);
    cp.add(Cmdconsulta);
    

    TxtArquivo = new JTextArea();
    TxtArquivo.setLineWrap(true);
    js = new JScrollPane(TxtArquivo);
    js.setBounds(5,40,385,280);
    js.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    cp.add(js);
	        
	}
	        
        
    public void actionPerformed(ActionEvent e){

    if(e.getSource() == CmdEscolher){

        int res = Arquivo.showOpenDialog(this);

        if(res == JFileChooser.APPROVE_OPTION){
            File arq = Arquivo.getSelectedFile();
            try{
                TxtArquivo.setText(retornaString(arq.getPath()));
            } catch(Exception ex){
                JOptionPane.showMessageDialog(null, "Não foi possível abrir o arquivo" +  arq.getPath() + "!", "Leitura de arquivo", JOptionPane.ERROR_MESSAGE);
            }
        }

    }

    if(e.getSource() == CmdSalvar){

        int res = Arquivo.showSaveDialog(this);
        if(res == JFileChooser.APPROVE_OPTION){
           File arq = Arquivo.getSelectedFile();
            try{
                escreveArquivo(TxtArquivo.getText(), arq.getPath());
            } catch(IOException ioe){
                JOptionPane.showMessageDialog(null, "Não foi possível salvar arquivo!");
            }
        }

    }
   

   if(e.getSource() == Cmdconsulta){
            try{
            	DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
                String url = "endereco do banco de dados;
                this.conn = DriverManager.getConnection (url, "nome do servido ", "nome e numero do servido");
                Statement st = conn.createStatement();
               
                // Tentativa conexao atraves do butao de consulta
                
                ResultSet rs = st.executeQuery("select nome_tabela1, nome_tabela2, nome_tabela2, from condição"); // executando a query
                
	                    
                //imprimindo a o resutado
                
                while( rs.next()){
                	String strnome_tabela1 = rs.getString("nome_tabela1");
                	String strnome_tabela2 = rs.getString("nome_tabela2");
                    String strnome_tabela3 = rs.getString("nome_tabela3");
                    
                	System.out.println("Atribuindo String");
                	
                	
                	TxtArquivo.append(strnome_tabela1);
                	TxtArquivo.append(" ");
                    TxtArquivo.append(strnome_tabela2);
                    TxtArquivo.append(" ");
                    TxtArquivo.append(strnome_tabela3);
                    TxtArquivo.append(" \n");
                	                        	
                    }

                rs.close();
                st.close();
                conn.close();


                }catch(SQLException e1){
                     System.out.println("Erro ao conectar ao banco");
                     e1.printStackTrace();
		
				}finally{ // Finalizando a conexão
                     System.out.println("Encerrando a conexão");
                
                }


          }

        }

//ler linhas do arquivos txt selecionados com o butao escolher e imprimi no textArea somente as linhas que começam com a letra b

public String retornaString(String fileName) throws IOException { 

    BufferedReader in = new BufferedReader(new FileReader(fileName));
    String line;
    StringBuffer buffer = new StringBuffer();
    char tmp;

    while( (line = in.readLine()) != null ){
    	tmp = line.charAt(0);
    	if(tmp == 'b'){
           buffer.append(line + "\n");
    	}
    }

    in.close();
    return buffer.toString();

}


public void escreveArquivo(String conteudo, String fileName) throws IOException {
	
	

    PrintWriter out = new PrintWriter(new FileWriter(fileName));
    out.print(conteudo);
    out.close();
    JOptionPane.showMessageDialog(null, "Arquivo salvo com sucesso!");

}

public static void main(String args[]){

    Tentativa app = new Tentativa();
    String url = "endereco do banco de dados oracle";
            app.show();

}

}
:lol:
eu acho que eu tenho que criar uma array para guardar os valores das linhas da tabelas e poder verificar se eles tem menos de oito caracteres!
Sera que alguem ai poder me ajudar? :wink:

Frank_Castle

Ola amigo peresjuliao…eu tamb estou fazendo os exercicios da caelum e me encontro no capitulo que vc citou…

Confesso que estou “apanhando” um pouco nesta parte de arrays pq tamb sou iniciante…rsrs…

Mas abaixo eu acho que resolvi o problema do metodo adiciona…

void adiciona(funcionario f){

for(int i = 0; i < funcionarios.length; i++){

                   System.out.println(funcionarios[i]);

        }

}

Eu to meio “empacado” no exercicio 03 do capitulo 05 da caelum…mas até o fim da semana eu dou um jeito…rsrs… sei que faltam mais coisas nesse metodo que …mas pelo menos vc já tem um ponto de partida…

Abraços!!!

peresjuliao

Sou dificil em desistir de algo do que estou fazendo gosto de ir até o fim, mas este exercício ai vou te falar uma coisa. Ainda pego ele sabe estou irado com este exercício.

Acho que falta um pouco mais de explicação e exemplos.

Frank_Castle

Amigo peresjuliao … acho que consegui resolver mais ou menos nosso problema nesse exercicio de arrays…

Têm um forum no guj em que o membro rick_z postou algumas soluções no rodapé do forum e tomando-as como base eu consegui otimizar ainda mais o código (e o programa tá rodando).

O link é : http://www.guj.com.br/posts/list/48982.java

O meu problema neste caso foi entender mais ou menos a lógica que ele havia seguido (pois não adianta apenas tomar códigos como base…temos que entendê-los né? rsrsrs )

Ainda faltam alguns detalhes mas assim que eu tiver terminado eu dou um jeito de postar alguma coisa…

Abraços!!!

Marky.Vasconcelos

Nossa… lembro desse exercicio da apostial da Caelum… eu começei a estudar e parei por causa disso…

Depois de um tempo voltei do zero e quando chegou ai…
pulei^^
Mas aprendi a usar depois de um tempo… agora eu acho extremamente idiota por que eu parei da outra vez.

peresjuliao

Olá Mark_Ameba?

Então conta para nós o que você fez, são através dessas experiências pessoais, que precisamos para conseguirmos resolver nossos problemas.

Diga o que fez, como por exemplo cursos, livros, tutoriais, etc…

Sou super mente aberta para este tipo de coisa sabe, isso vai me ajudar e muito.

Abraços

Frank_Castle

Eh ai peresjuliao blz?

Então..como eu havia prometido..aki vai a solução dakele nosso probleminha da apostila da caelum...(desculpe demorar para postar...mas além de tomar uma "surra" desse exercicios eu andei meio sem tempo pra postar...rsrs... :)

Então...lá vai o código rodando com as explicações do que ele faz....(estão bem basicas e até meio bobinhas...é só pra vc entender mesmo o que foi feito).

class Funcionario{

	String nome;

	String dept;

	String rg;

	double salario;



	void bonifica(double aumento){ // Esse método apenas atualiza o salario do funcionario caso ele receba um "aumento".

		
		double atualiza = this.salario + aumento; // Somamos o salario atual com o aumento (atualizando em seguida).

		this.salario = atualiza; 

	}

}
Frank_Castle
class Empresa{


	String nome;

	String cnpj;

	boolean estaNaEmpresa;

	Funcionario[] funcionarios; // Declaramos um vetor funcionarios em extensão da class Funcionario 
	

	void adiciona(Funcionario f){ // o "f" aqui i é o argumento do Método adiciona.

		
		for(int i = 0; i < this.funcionarios.length; i++){// Usamos o lenght para  aumentar o tamanho do vetor e o this para referencia-lo.

						

			if(funcionarios[i] == null){ // verificamos se o funcionario é igual a "null"

							
				
				funcionarios[i] = f; // em seguida atribuimos o vetor com o argumento do método.


	
			break; // Aqui sem o "break", apenas o primeiro funcionario é exibido na tela.		

			
							
												
			}	

					

		}
Frank_Castle
void mostra(){


		for(int i = 0; i < this.funcionarios.length; i++){

		
			if(funcionarios[i]!= null){ // Verificamos se o vetor é diferente de "null"

				
			
				System.out.println("\n" + funcionarios[i].nome +"\n" + funcionarios[i].salario + "\n");	

				// acima é impresso o nome e o salario do funcionario.
		
				
			}

			
		}

	}
Frank_Castle
class TestaFuncionario02{

	
	public static void main(String[] args){


		Empresa empresa = new Empresa(); 

		empresa.funcionarios = new Funcionario[10]; // Aqui é declarada a quantidade de espaço na memoria utilizada pelo vetor



		Funcionario02 f1 = new Funcionario();	// e em seguida cadastramos nossos funcionarios.
			
							
			f1.nome = "Flavio";

			f1.salario = 1000;

		
			f1.bonifica(500);	// Aqui chamamos a função bonifica para exibirmos o salario já com aumento		
			

			empresa.adiciona(f1);

			
			


		Funcionario02 f2 = new Funcionario02();


			f2.nome = "Debora";
		
			f2.salario = 120;			
			

			empresa.adiciona(f2); // imprimindo no método mostra o nome e salario 

	}

}

Bem é isso... espero ter ajudado.

É claro que ainda temos mais espaço na Memória para outros funcionarios.

Mas em meu exemplo eu quis mostrar só dois (e vc pode fazer um "loop", para cadastrar os seus funcionarios sem a necessidade de add um a um).

Sei que tem excesso de cometários...mas como vc estava com dificuldade eu achei melhor explicar com mais detalhes. (afinal esse exercicios não é tão simples para iniciantes como nós rsrsr :)

E vc não imagina o como "apanhei" desse exercicio... :)

Lógico que tem mais coisas...mas seria sacanagem postar o exercicio feito....rsrs... e a finalidade do forum não é essa.

Mas qualquer coisa que eu puder fazer (e conseguir ajudar...rsrs) é só falar.

Abraços e não desista hein?... :)

Criado 19 de dezembro de 2008
Ultima resposta 20 de jan. de 2009
Respostas 23
Participantes 9