Puxar vetor de outra classe

olá gente, estou fazendo uma aplicação para a faculdade e queria saber como puxo o vetor que um método de outra classe retorna. código:

import java.util.Scanner;

public class Notas{

Scanner lerMateria = new Scanner (System.in);

Scanner lerNota = new Scanner (System.in);

float notas[][] = new float[6][2];

String materias[] = new String [6];

int contador = 0;

String[] lerMaterias(){

  contador = 0;

  while (contador <= 5){

  	System.out.println("");
  	System.out.println ("Insira o nome da materia: ");
  	materias[contador] = lerMateria.nextLine();
  	System.out.println("");

  	contador ++;
  }

  return materias;

}

  float[][] lerNotas(){

  	contador = 0;

  	while (contador <= 5){

  		System.out.println("");
  		System.out.printf ("Insira a primeira nota da materia %s: ", materias[contador]);
  		notas[contador][0] = lerNota.nextFloat();
  		System.out.println("");

  		System.out.println("");
  		System.out.printf ("Insira a segunda nota da materia %s: ", materias[contador]);
  		notas[contador][1] = lerNota.nextFloat();
  		System.out.println("");	

  		contador ++;
  	}

  	return notas;
  }

}

Do jeito mais simples, é vc instanciar a sua classe notas e chamar o método .
Ex.:
Public class Média{
private Notas notas = new Notas();

private void buscaNotas(){
float [] [] notas = notas.lerNotas();
}

Lembrando nesse exemplo o objeto Notas foi instanciado na classe media, então é um objeto novo, nesse exemplo vc precisa setar os valores nessa instância.

tentei usar isso, porém quando tento instanciar a classe aparece:

cannot find symbol
        private Notas notas = new Notas();

Se você instanciar dentro de um método, não precisa (e não pode) indicar a visibilidade já que a visibilidade será a do método. Se instanciação ocorre na classe, mas fora de um método, aí pode.

1 - Dentro de um método

public class Classe1 {
	
}

public class Classe2 {
	private void metodoClasse2(){
		Classe1 classe1 = new Classe1();
	} 
}

2 - Fora de um método

public class Classe1 {
	
}

public class Classe2 {
	private Classe1 classe1 = new Classe1(); 
}

Igualmente ele da erro ao compilar, aparenta que não acha a classe, porém as duas estão no mesmo pacote. Código que tentei usar:

public class Medias{

private Notas notas = new Notas();

private void buscaNotas(){

  float[][] notas = notas.lerNotas();

}
}

Por qual razão você está criando dois objetos do tipo Scanner com o System.in?
O System.in é um só, então basta um único objeto Scanner.

Essas variáveis só são utilizadas dentro dos métodos, então não há motivo para declarar como sendo atributos.
Declare elas dentro dos métodos apenas.

Posta a mensagem exata do erro.

Quando eu declarava somente um Scanner, por algum motivo pulava algumas leituras, criando dois consegui resolver.

sobre as variáveis, quando deixo elas somente dentro do método aparece o seguinte erro ao compilar:

error: cannot find symbol
System.out.printf ("Insira a primeira nota da materia %s: ", materias[contador]);
^
symbol: variable materias
location: class Notas
src\br\edu\principal\Notas.java:44: error: cannot find symbol
System.out.printf ("Insira a segunda nota da materia %s: ", materias[contador]);
^
symbol: variable materias
location: class Notas
2 errors

Já o erro que dá ao compilar a classe quando tento instanciar a outra dentro dela é:

error: cannot find symbol
Notas notas = new Notas();
^
symbol: class Notas
location: class Medias
src\br\edu\principal\Medias.java:5: error: cannot find symbol
Notas notas = new Notas();
^
symbol: class Notas
location: class Medias
src\br\edu\principal\Medias.java:9: error: cannot find symbol
float[][] notas = notas.lerNotas();
^
symbol: method lerNotas()
location: variable notas of type float[][]
3 errors

É que você utiliza o método nextFloat(), esse método não consome a quebra de linha quando você pressiona o ENTER.
O único método do Scanner que consome a quebra de linha é o nextLine().
Então você tem duas alternativas:

  • Chamar o nextLine() imediatamente após o nextFloat();
  • Não chamar o nextFloat() e ao invés disso fazer Float.parseFloat(meuObjetoScanner.nextLine()).

O problema foi a falta de atenção, veja:

public class Medias{

    // aqui tem uma variável chamada 'notas'
    private Notas notas = new Notas();

    private void buscaNotas(){

        // aqui declarou uma variável do tipo 'float[][]' e também chamou de 'notas'
        // aí quando tenta chamar o método 'lerNotas' vai dar erro
        // pois o tipo de dado 'float[][]' não tem um método 'lerNotas'
        float[][] notas = notas.lerNotas();

    }
}

Ou você utiliza o this para referenciar a variável de instância:

public class Medias{

    private Notas notas = new Notas();

    private void buscaNotas(){

        float[][] notas = this.notas.lerNotas();

    }
}

Ou muda o nome da variável local:

public class Medias{

    private Notas notas = new Notas();

    private void buscaNotas(){

        float[][] outroNomePraVariavel= notas.lerNotas();

    }
}

tentei fazer as mudanças porém o erro continua o mesmo ao tentar compilar

cannot find symbol
private Notas notas = new Notas();
^
symbol: class Notas
location: class Medias
src\br\edu\principal\Medias.java:5: error: cannot find symbol
private Notas notas = new Notas();
^
symbol: class Notas
location: class Medias
2 errors

Qual package da classe Medias e qual o package da classe Notas?

Ambas estão no package br.edu.principal

Como está fazendo para compilar?

Mas está declarando o package no arquivo ou só colocou os arquivos dentro da pasta correspondente?

Criei um arquivo .bat que meu professor passou o código para abrir o cmd e compilar automaticamente

“C:\Program Files\Java\jdk-12.0.2\bin\javac.exe” -d bin src\br\edu\principal\Medias.java

Para isso teria que alterar algo nas variáveis de ambiente? eu cheguei a configura-las quando comecei a programar, mas não sei se tem que alterar mais algo quando vou trabalhar com várias classes.

Então posta o comando pra gente ver.

Está executando o javac a partir de qual pasta?
Está incluindo a pasta raíz do teu programa no classpath da aplicação usando o parâmetro -classpath?

Não, para isso você usa o parâmetro -cp ou -classpath ao executar o compilador.

No seu exemplo ficaria assim:

"C:\Program Files\Java\jdk-12.0.2\bin\javac.exe” -d bin -classpath src src\br\edu\principal\Medias.java

Consegui compilar, muito obrigado pela ajuda!

1 curtida