• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

java - wyswietlania zawartości tablicy

Object Storage Arubacloud
0 głosów
3,909 wizyt
pytanie zadane 11 listopada 2017 w Java przez witekr Nowicjusz (150 p.)

Witam.

Jestem początkujący i utknąłem na wyświetleniu zawartości tablicy w pętli.

Program pobiera informacje, natomiast przy wyświetlaniu wypisuje tylko wartość ostatniego wpisu, zdaje się , jakby ostatni wpisywany element stawał się wartością dla wszystkich wcześniejszych pozycji tablicy.

package company;

import java.util.Scanner;

public class administracja {

	Scanner input = new Scanner(System.in);
	static int liczba = 2;
	static int pocz=0;
	private pracownik[] pracownicy = new pracownik[liczba];

	public int getPocz() {
		return pocz;
	}

	public administracja () {
		pracownicy= new pracownik[liczba];
	}
	


	public pracownik tworz() {
		System.out.println("podaj imię");
		String name = input.nextLine();
		System.out.println("podaj nazwisko");
		String surname = input.nextLine();
		return new pracownik(name, surname);

	}
	
	public void add() {
		//while (pocz<liczba) {
			//pracownicy[pocz] = tworz();
			
		//}
		
		for (pocz = 0; pocz < liczba; pocz++) {
		
			pracownicy[pocz] = tworz();
			//pracownicy[pocz] = new pracownik();
		}
	}

	public void print() {
		for (int a = 0; a < pracownicy.length; a++) {
			pracownicy[a].info();

		}
	}
}

 

komentarz 11 listopada 2017 przez witekr Nowicjusz (150 p.)
package company;

public class comp {
	public static void main(String[] args) {
		administracja admin = new administracja();

		
		admin.add();
		admin.print();

	}
}

 

2 odpowiedzi

0 głosów
odpowiedź 12 listopada 2017 przez Codeboy Stary wyjadacz (12,120 p.)
wybrane 12 listopada 2017 przez witekr
 
Najlepsza

Nie wiem jak masz zaimplementowaną metodę info() dla pracownika, ale, gdy używam zwykłego toString() na pracowniku i printuje:

System.out.println(pracownicy[a].toString());

zamiast:

pracownicy[a].info();

to informację się wyświetlają poprawnie.

Strzelam, że coś z twoją metodą info() jest nie tak. Pokaż ją, a się dowiemy ;)

PS: Nazwy klas z dużej! smiley

komentarz 12 listopada 2017 przez witekr Nowicjusz (150 p.)

Po zmianie info na toString - wyświetla mi krzaczki typu "company.pracownik@55f96302" - ale jak się domyślam  musze nadpisać metodę toString. Po nadpisaniu jej , nadal wyświetla mi tylko info o ostatnim wpisanym pracowniku.

Metoda info(). według mnie wygląda normalnie , znajduje się w klasie pracownik:


public void info ( ) {
	String infos = getName() + "  " + getSurname();
	System.out.println(infos);
	
}

Co do nazw klas z dużej - dzięki za zwrócenie uwagi, posataram się tego trzymać.

komentarz 12 listopada 2017 przez Codeboy Stary wyjadacz (12,120 p.)

To nie są żadne krzaczki tylko nazwa klasy i jej hashcode ;) Ale tak, zazwyczaj się to nadpisuję, żeby wyświetlić opis we własny sposób. W swoim IDE powinieneś znaleźć opcję, która Ci to wygeneruję na podstawie pól klasy, więc nie musisz tego robić ręcznie.

Btw. te numerki na końcu (hashcode) miałeś różne?

Stworzyłem sobie na szybko klasę pracownik, bo nie wiem jak ona u Ciebie tam wygląda i nadpisałem toString():

public class pracownik {
	private String name;
	private String surname;
	public pracownik(String name, String surname) {
		this.name = name;
		this.surname = surname;
	}
	@Override
	public String toString() {
		return "pracownik [name=" + name + ", surname=" + surname + "]";
	}
}

Myślę, że masz podobnie, tyle, że z geterami, hm?. Metoda print wygląda tak:

public void print() {
    for (int a = 0; a < pracownicy.length; a++) {
        System.out.println(pracownicy[a].toString());    
    }
}

I wszystko działa jak należy. Nic więcej nie zmieniałem. Wiec co masz inaczej? Bo czegoś definitywnie mi nie pokazujesz ;) Żeby nie było, że mówię nie prawdę:



Podrzuć mi klasę Pracownik, to w niej musi leżeć błąd ;) Chyba się domyślam co tam masz nie tak.


 

komentarz 12 listopada 2017 przez witekr Nowicjusz (150 p.)
edycja 12 listopada 2017 przez witekr

Tak, wartości przy krzaczkach były różne.

Nadpisałem tę metodę tak samo jak u ciebie , jednak dalej wartości na końcu są takie same:

podaj imi?
1
podaj nazwisko
1
podaj imi?
2
podaj nazwisko
2
pracownik [name=2, surname=2]
pracownik [name=2, surname=2]

 

Klasa pracownik:

package company;

public class pracownik {
private static String name;
private static String surname;

public static String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public static String getSurname() {
    return surname;
}
public void setSurname(String surname) {
    this.surname = surname;
}
public pracownik(String name, String surname) {
    setName(name);
    setSurname(surname);
}
public pracownik() {}
public void info ( ) {
    String infos = getName() + "  " + getSurname();
    System.out.println(infos);
    
}
@Override
public String toString () {
    return getName() + getSurname();
    
}
}

 

1
komentarz 12 listopada 2017 przez Codeboy Stary wyjadacz (12,120 p.)
edycja 12 listopada 2017 przez Codeboy

No tak jak myślałem, pozbądź się wszystkich modyfikatorów static, są one tu kompletnie nie wskazane.

To co jest zadeklarowane jako static związane jest z konkretną klasą, a nie z jej instancją i możemy się do nich odwoływać bez tworzenia tej klasy (np. bezpośrednio Pracownicy.name). Pola jak name i surname powinny należeć do konkretnej instancji klasy Pracownik, prawda?

static dla metody sprawia, że jest statyczna, czyli z jej wnętrza nie możemy odwoływać się do pól i metod nie statycznych. Metody statyczne nie mogą przecież operować na danych konkretnej instancji obiektu, bo samo wywołanie tej metody nie wszyło od konkretnej instancji klasy.

Dlatego pokazują Ci się tylko jedne dane, bo tak jakby przypisujesz je globalnie do klasy.

komentarz 12 listopada 2017 przez witekr Nowicjusz (150 p.)
Ufff, dzięki, działa.

Faktycznie wszystko przez te zmienne statyczne.

Dzięki wielkie , długo się nad tym męczyłem , a to chodziło o taki "mały błąd".
komentarz 12 listopada 2017 przez Codeboy Stary wyjadacz (12,120 p.)
To nie taki całkiem mały błąd. Warto na początku nauczyć się działania wszystkich modyfikatorów i kiedy je stosować. To dosyć ważny element Javy ;)
komentarz 12 listopada 2017 przez witekr Nowicjusz (150 p.)
Tak ,w rzeczy samej nie taki mały, sprawdzałem wszystkie możliwe metody, a błąd znajdował się gdzie indziej.

Dzięki jeszcze raz.
0 głosów
odpowiedź 11 listopada 2017 przez Aisekai Nałogowiec (42,190 p.)
A w jakiej kolejności wywołujesz te metody?

 Po co Ci zmienne statyczne? Bo rozumiem, że nie chodziło Ci o to, aby pocz i liczba były niepowiązane z obiektem a z klasą?

Zdecyduj się na nazewnictwo. Albo używasz w projekcie samych polskich nazw (nierekomendowane) albo angielskich (rekomendowane). Bo potem się robią metody typu getPracownikWhereImie() czy inne addMorePasażerowie();

Zmienne w pętli (pętli for) powinno się nazywać od zaczynając od i, bardziej wewnętrzne pętle tym dalej w alfabet.
komentarz 11 listopada 2017 przez witekr Nowicjusz (150 p.)
dobrze dzięki, będę się trzymał angielskich nazw i numeracji w pętlach.

Metody są wywoływane według kolejności:

administracja.add ( w której na pierwszym miejscu wywoływana jest inna metoda - tworząca obiekt), po czym dodanie obiektu do tablicy.

następnie jest wywoływana metoda wyświetlania informacji o obiektach.

Co do statycznych zmiennych - tak właśnie myślałem, że będzie lepiej jak będą one powiązane z klasą - ale jeśli źle myślałem , to czemu to źle?

Podobne pytania

0 głosów
0 odpowiedzi 1,086 wizyt
pytanie zadane 20 marca 2020 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 2,303 wizyt
pytanie zadane 2 marca 2019 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
3 odpowiedzi 497 wizyt
pytanie zadane 9 stycznia 2019 w Java przez msukiennik Początkujący (380 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...