Przekazywanie String'ów między metodami

0

Nie wiem co należy napisać zamiast void aby metoda zwracała Stringa.

Poniższy zapis jest błędny.

public class Testowa{

String test(){
	String a = "test";
	
	return a;
}}

public class Inna{
public static void main(String args[]){
Testowa nowa = new Testowa();
nowa.test();
System.out.println(nowa.a);}}

Błąd: cannot find symbol variable a

0

Masz błąd w metodzie main(). Powinno być tak:

public class Testowa{
         String test(){
                String a = "test";                
                return a;
        }}
public class Inna{
    public static void main(String args[]){
            Testowa nowa = new Testowa();
            System.out.println(nowa.test());}}

Teraz powinno wypisać słowo test.

0

Faktycznie wypisało, jednak potrzebuję dostać się do stringa przez jego nazwę. Moja rzeczywista metoda powinna zwracać kilka różnych stringów i potrzebuję mieć do nich osobny dostęp. Metoda może zwracać kilka wartości, prawda? [???]

0

Metoda może zwracać kilka wartości, prawda?

Raczej nie prawda...
W klasie Testowa możesz zrobić pola tekstowe publiczne i odwoływać się do tych pól, lub prywatne i dopisać metody zwracające wartości tych pól. To drugie rozwiązanie wydaje się być bardziej powszechne.

0

1)Jesli wartosci te nie maja "czesci wspolnej" -> napisz osobne gettery
2)jesli tworza jakas logiczna calosc -> byc moze trzeba przemyslec opakowanie ich jakas klasa?

pozdrawiam

0
eximius napisał(a)

1)Jesli wartosci te nie maja "czesci wspolnej" -> napisz osobne gettery

gettery? Nie bardzo rozumiem o co chodzi

0

metody "getSomething()"

pozdrawiam

0

@Anonimka23, zmienna a którą masz w metodzie test() jest widoczna, czyli można się do niej odwoływać tylko we wnętrzu metody test().
Podstawowy błąd polega na tym iż chcesz odwołać się do zmiennej, która jest niewidoczna na zewnątrz funkcji.
Najprostszym rozwiązaniem jest stworzenie nowej zmiennej do której zostanie przypisany wynik działania funkcji:

public class Testowa{
         String test(){
                String a = "test";               
                return a;
        }}
public class Inna{
    public static void main(String args[]){
            Testowa nowa = new Testowa();
            String noweA = nowa.test();
            System.out.println(noweA);}}

Metody zwane getterami i setterami (czasami też metodami wybierającymi i ustawiającymi) to metody, które pozwalają na kontrolowany dostęp do pól obiektów. W swojej najprostszej formie wydaja się niepotrzebne, lecz czasami znacznie ułatwiają życie.
Przykład klasy z jednym polem i odpowidnim getterem i setterem:

class Przyklad{
   private Object zmienna;
   public Object getZmienna(){
      return zmienna;
   }
   public void setZmienna(Object zmienna){
      this.zmienna = zmienna;
   }

}

Jak widzisz pole zmienna jest prywatne i tym samym niewidoczne nigdzie indziej poza klasą. Jednak masz dwie metody getZmienna() i setZmienna(), które pozwalają i pośredniczą w pobieraniu i ustawianiu wartości pola.

0

Hej koziołek mam taki problem, piszę program na prace licencjacką - troche wyciąłem nie potrzebnego kodu ale zetknąłem sie z takim problemem:
Chce korzystać z wartości zmiennych w geterze ale z poziomu innych klas.
Proszę o pomoc.

public class KlasaMain extends JPanel implements ActionListener {
public static JFrame frame;
private JMenuItem menuPlikAudio;
private JMenuItem menuPlikNoise;
public String fileType;
public Thread watekReadWave;
public Thread watekPlayWave;

public static void main(String[] args) {
	KlasaMain obiekt = new KlasaMain();
	obiekt.initGUI();
}

    public void initGUI() { 
[...]
	JMenuBar menuBar = new JMenuBar();	
	JMenu menuPlik = new JMenu("Plik");	
	menuPlik.setMnemonic(KeyEvent.VK_P);
	menuBar.add(menuPlik);
		menuPlikAudio = new JMenuItem("Otwórz Plik Dźwiękowy (WAVE)");
		menuPlikAudio.addActionListener(this);
		menuPlik.add(menuPlikAudio);	//dodanie pozycji do menu
			
		menuPlikNoise = new JMenuItem("Otwórz Plik Szumu (WAVE)");
		menuPlikNoise.addActionListener(this);
		menuPlik.add(menuPlikNoise);
[...]	
}	

//Interfejsy nasłuchu
public void actionPerformed(ActionEvent e){

	 if (e.getSource() == menuPlikAudio) {  //KlasaOpenAudio
		 setFileType("audio"); //<span style="color: blue"><------- PRZYPISUJĘ</span>
		 KlasaOpenAudio obiektOpen = new KlasaOpenAudio();
   	     Thread watekOpenAudio = new Thread(obiektOpen);	 
   	     System.out.println("KlasaMain: " + getFileType());  //<span style="color: green"><-- TU JEST OK</span>
   	     watekOpenAudio.start();
	 }
	 
	 if (e.getSource() == menuPlikNoise) {	//KlasaOpenAudio
		 setFileType("noise");
   		 KlasaOpenAudio koa = new KlasaOpenAudio();
   	     Thread watekOpenAudio = new Thread(koa);	 
   	     watekOpenAudio.start();
	 }
}


public void setFileType(String s){
	fileType = s;
}
public String getFileType(){
	return fileType;
}

}

##############################################33

public class KlasaOpenAudio implements Runnable {
private File openFile;
public String dialog;
public KlasaMain obiektMain = new KlasaMain();

public void run()  { 
	openFile(); 
}

public void openFile() { //<--- I TU WLAŚNIE SA JUŻ NULLE
	if (obiektMain.getFileType() == "audio"){  //<span style="color: red"><-- ŻADEN WARUNEK SIE NIE ZGADZA</span>
		dialog = "Wybierz zakłócony plik muzyczny...";
	}else if (obiektMain.getFileType() == "noise"){
		dialog = "Wybierz plik szumu...";
	}
[...]

}

Ogólnie to jest jeden rodzaj zmiennej, chce jeszcze przekazac zmienną typu File w podobny sposob, a takze uzywac tych zmiennych jeszcze w kliku innych klasach, nie wiem jak rozwiązać taki problem, proszę o pomoc.
</b>

0

.equals("audio")

pozdrawiam

0

@seismic, ale w drugiej klasie masz już zupełnie nowy obiekt. Ja bym to zrobił tak:

public class KlasaMain extends JPanel implements ActionListener {
//....
  public void actionPerformed(ActionEvent e){
           
                 if (e.getSource() == menuPlikAudio) {  //KlasaOpenAudio
                         setFileType("audio"); //<------- PRZYPISUJĘ
                         KlasaOpenAudio obiektOpen = new KlasaOpenAudio();
                         obiektOpen.setObiektMain(this);
                        Thread watekOpenAudio = new Thread(obiektOpen);        

//..........

}

public class KlasaOpenAudio implements Runnable {
        public KlasaMain obiektMain;
//.........
        public void setObiektMain(KlasaMain obiektMain){
                this.obiektMain = obiektMain;
        }
//..........

}

W ten sposób w KlasaOpenAudio korzystasz z tego samego obiektu co w KlasaMain :)

Generalnie pamiętaj, że jeżeli używasz gdzieś operatora new to musisz myśleć o utworzonym w ten sposób obiekcie jak o zupełnie innym bycie. Czymś co ma własne własności i żyje własnym zyciem

0

Dzięki wielkie - elegancko chodzi.
Tylko ze teraz myslałem że będzie już ładnie pięknie jak sobie stworze oddzielne obiekty analogicznie dla innych klas bo chce miec plik tez w innych klasach a tu nie działa.

KlasaMain {
KlasaOpenAudio obiektOpen = new KlasaOpenAudio();
KlasaReadWave obiektRead = new KlasaReadWave();
//...
obiektOpen.setObiektInOpen(this);
obiektRead.setObiektInRead(this);
}

KlasaOpen {
public KlasaMain obiektMain;
public void setObiektInOpen(KlasaMain obiektKlasaMain){
this.obiektMain = obiektKlasaMain;
}

Potem po jakiejs tam operacji na obiektMain.getFile()) leci klasa read i chce zrobic to samo analogicznie:
KlasaRead {
public KlasaMain obiektMain;
public void setObiektInRead(KlasaMain obiektKlasaMain){
this.obiektMain = obiektKlasaMain;

public void run(){
    System.out.println("KlasaReadWave: " + <span style="color: red">obiektMain.getFile()</span>); 	
}

}

i teraz w read jak chce wywolac funkcję od tego obiektu to w princie:
obiektMain.getFile())
juz jest :
Exception in thread "Thread-6" java.lang.NullPointerException
at KlasaReadWave.run(KlasaReadWave.java:34)
at java.lang.Thread.run(Unknown Source)

obiektu nie ma

0

Tamto co pisal Koziolek chodzi OK, ale to bylo przekazaniem obiektu z jednej klasy do drugiej klasy i wsio.
Teraz mi chodzi o to zebym mogl jeszcze w innych klasach korzystac z tego obiektu.
I jak zrobilem analogicznie drugie przekazanie this to nie dziala :-(.

Jesli zasada jest zła to niech proszę ktoś wytłumaczy jak inaczej przekazuje sie obiekt do innych klas, zeby tam z pomoca niego mozna bylo korzystac z metod i zmiennych z glownej/pierwszej klasy.
Chce tu przekazywac m.in. zmienną typu File. Jak wy to robicie może napiszcie.

Wkleilem to tak w skrocie zeby z grubsza załapać o co biega bo caly kod troche dlugi.
Ale jak za malo dokładnie to wkleje cały.

Tak nawiasem pisze program na prace licencjacką i termin mi ucieka. Mam kilka dni jeszcze. Bardzo prosze o pomoc.

0

robisz to w ten sam sposób jak podałem. Po prostu tworzysz sobie metody, które jako parametry przyjmują odpowiednie obiekty. I tyle

0

Dzieki wam bardzo. Juz sobie radze z tym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1