Przekazywanie zmiennych między metodami

0

Witam mam przykładowy kod:

W klasie Inne_Zmienne

public int zmienne(int x1) {
		int zmienna1=3, zmienna2=5, zmienna3;
		zmienna3 = zmienna1 + zmienna2+3;
		 x1 = zmienna3;
		 
		 return x1;

Następnie w tej samej klasie mam 2 metodę:

public int pozmieniaj(int x2){
		x2 = x1 + 5;
		return x2;
	}

Problem polega na tym, że chciałbym przekazać do "Pozmieniaj" wynik x1 z "Zmienne".

Jednakże wszelkie moje próby kończyły się maksymalnie tym, że wywoływałem całą metodę, a chciałem pobrać jedynie jej wynik.

Proszę o pomoc jak pobrać wynik z jednej metody do drugiej?

0
int foo()
{
    return 3 + 5 + 3;
}

int bar(int x1)
{
    return x1 + 5;
}
...
int result = bar(foo());
0
Noface napisał(a):

Jednakże wszelkie moje próby kończyły się maksymalnie tym, że wywoływałem całą metodę, a chciałem pobrać jedynie jej wynik.

Jak wyobrażasz sobie pobranie wyniku od niewywołanej metody? Jak taki wynik miałby wg Ciebie powstać?

0

Althorion

Chodzi mi o sytuację np taką w metodzie TableSize:

int inSize() {
		
		int elIn = in.nextInt();
		 
		return elIn; 
		
	}

Metoda pobiera dane z klawiatury. "elIn" chciałbym użyć np w metodzie View:

public void NTable(){
		TableSize ct = new TableSize();
		System.out.println("Tablica " + ct.inSize() + " elementowa.");
	}
	

Chciałbym, że mietoda View wyświetlała jedynie wartość, która została pobrana z klawiatury w metodzie "inSize". Mówiąc o wywołaniu całej metody miałem na myśli to, że używając w metodzie main:

                TableSize rozmiar = new TableSize();
		View vt = new View();
		rozmiar.inSize();
		vt.NTable();

Najpierw pobieram dane z klawiatury, następnie znowu pobieram dane z klawiatury i wyświetlam komunikat o wartości, którą pobrałem z klawiatury.

A moim celem jest:

  1. pobranie wartości
  2. Wyświetlenie jej na ekranie za pomocą innej metody.

Twonek, dziękuję za odpowiedź, jednak najzwyczajniej nie rozumiem jak mógłbym użyć przedstawionego przez Ciebie rozwiązania np. w powyższym kodzie.

0

Tak się nie da. Funkcje stanowią zamkniętą całość i nie możesz się do nich dorwać w połowie.

Dlatego też przy programowaniu obowiązuje zasada pojedynczej odpowiedzialności — każda funkcja powinna robić dokładnie jedną rzecz, czyli albo pobierać dane, albo na nich operować. Wtedy unika się takich problemów, jakie Ty napotkałeś. To znak, że czas na refaktoryzację kodu.

0

"Albo pobierac, albo na nich operowac".

Chyba nie do konca rozumiem. To wlasnie chcialem osiagnac.

Chcialem w jednej klasie pobrac od uzytkownika dane, w innej za pomoca tych danych stworzyc tablice, ktora uzytkownik by wypelnil.

Chcialem tez np. Stworzyc metode gdzie uzytkownik wypelnia ta tablice. Tak wiec sie nie da?

To strasznie pogmatwane, ale moim celem w tym wszystkim bylo przyswojenie sobie umiejetnosci operowania na klasach i metodach.

0

Nie zrozumiałem tego co opisałeś, ale popatrz na to i powiedz czy to jest to o czym myślisz:

class A {
	private int a;
	
	public void readValue() {
		Scanner scanner = new Scanner(System.in);
		a = scanner.nextInt();
	}
	
	public int getValue() {
		return a;
	}
}

class B {
	public void show(int value) {
		System.out.println("My value is " + value);
	}
}

class Ideone {
	public static void main (String[] args) throws java.lang.Exception {
		A a = new A();
		B b = new B();
		a.readValue();
		b.show(a.getValue());
	}
}

http://ideone.com/w2nQwc

0

Super, wprowadziłem te poprawki w mój kod i teraz działa dokładnie tak, jak tego chciałem.

Więc tak, dokładnie o to mi chodziło. Dziękuję za pomoc.

0

Zrobię nowym postem bo chciałbym dodać nową kwestię.

package Table;
import java.util.*;
class CreateTable {
	
	private int ts;
	private int [] table;
	private Scanner in = new Scanner(System.in);
	
	public void StworzTablice () {
	TableSize tabSize = new TableSize();
	table = new int[tabSize.getSize()];
	
	
	
	}
	
	public void WypelnijTablice() {
	
	for (int i=0; i<table.length; i++) {
		table[i] = in.nextInt(); <--- Tutaj Eclipse wskazuje NullPointera
		
			
	}
	
	}
	

Nie rozumiem czemu wywala mi podczas kompilacji tej części NullPointera? Wszystkie zmienne są zainicjowane. Tablica "Table" ma określoną wielkość, którą pobiera z metody getSize() z innej klasy.

Źle coś przekazuję? Metody, które odpowiadają za wielkość tablicy to:

public void inSize() {
		
		 elIn = in.nextInt();
		 
		
	}
	
	
	// Pobiera rozmiar tablicy
	public int getSize() {
		
		return elIn;

	}
	

Gdy zmieniam StworzTablice() tak:

class CreateTable {
	
	private int ts;
	private int [] table;
	private Scanner in = new Scanner(System.in);
	TableSize tabSize = new TableSize();
	
	public int StworzTablice (int indeks) {
	table = new int[StworzTablice(tabSize.getSize())];
	
	return table.length;
	
	}

To mam całą litanię błędów, ale pierwszym jest "Exception in thread "main" java.lang.StackOverflowError".

A main() wygląda tak:

public static void main(String [] args) throws NullPointerException {
		TableSize rozmiar = new TableSize();
		ViewTable vt = new ViewTable();
		CreateTable ct = new CreateTable();
		rozmiar.inSize();
		vt.NTable(rozmiar.getSize());
		System.out.println("Elementy tablicy");
		ct.WypelnijTablice();
		//vt.VTable();
	}

}

EDIT Finalny: Wybaczcie, że tak po milion razy edytowałem, ale w trakcie oczekiwania na odpowiedź ciągle jeszcze główkowałem nad tym kodem. Generalnie udało mi się dojść co powodowało problem i już to naprawiłem.

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