Problem z GregorianCalendar

0

Witam.
Javy uczę się od niedawna. Chcąc się zabrać poważnie do nauki nabyłem książkę Core Java 2 Podstawy. Natknąłem się właśnie na mały problem i mam nadzieję, ze ktoś pomoże mi to rozwiązać/zrozumieć.

import java.text.NumberFormat;
import java.util.*;

public class TestPracownika {
	public static void main(String[] args) {
		Pracownik[] obsluga = new Pracownik[4];
		obsluga[0] = new Pracownik ("Jan", "Kowalski", 1000, 2010, 3, 5);
		obsluga[1] = new Pracownik ("Anna", "Kowalska", 2000, 2011, 5, 6);
		obsluga[2] = new Pracownik ("Rafał", "Kowalski", 3000, 2010, 5, 30);
		obsluga[3] = new Pracownik ("Agata", "Kowalska", 1500, 2012, 6, 28);
		
		for (int i = 0; i < obsluga.length; i++) {
			obsluga[i].podniesPensje(10);
		}
		
		for (int i = 0; i < obsluga.length; i++) {
			Pracownik p = obsluga[i];
			
			double kwota = p.pobierzPensje();
			NumberFormat kwota2 = NumberFormat.getCurrencyInstance();
			String kwota3 = kwota2.format(kwota);
			
			System.out.println((i+1) + ":\t " + p.pobierzImie() + "\t" + p.pobierzNazwisko() + "\t" + /*p.pobierzPensje()*/kwota3 + "\t" + p.wypiszDzienZatrudnienia());
		}
	}
}

class Pracownik {
	public Pracownik(String i, String n, double p, int rok, int miesiac, int dzien) {
		imie = i;
		nazwisko = n;
		pensja = p;
		GregorianCalendar kalendarz = new GregorianCalendar();
		dzienZatrudnienia = kalendarz.getTime();
	}
	
	public String pobierzImie() {
		return imie;
	}	
	
	public String pobierzNazwisko() {
		return nazwisko;
	}
	
	public double pobierzPensje() {
		return pensja;
	}
	
	public void podniesPensje(double oProcent){
		double podwyzka = pensja * oProcent / 100;
		pensja = pensja + podwyzka;
	}
	
	public Date wypiszDzienZatrudnienia() {
		return dzienZatrudnienia;
	}
	
	private final String imie;
	private final String nazwisko;
	private double pensja;
	private Date dzienZatrudnienia;
}

Wynikiem programu jest to:

1: Jan Kowalski 1 100 zł Thu Jun 28 2056 CEST 2012
2: Anna Kowalska 2 200 zł Thu Jun 28 2056 CEST 2012
3: Rafał Kowalski 3 300 zł Thu Jun 28 2056 CEST 2012
4: Agata Kowalska 1 650 zł Thu Jun 28 2056 CEST 2012

Z tego co rozumiem z książki to powinno wyświetlić mi podane w tablicy obsluga daty zatrudnienia pracowników. Program jednak wyświetla mi wszędzie datę ostatniej kompilacji kody.
Dlaczego tak się dzieję?

Bardzo bym prosił o nie wieszanie psów na mnie, jest to mój pierwszy post na tym forum ;-)

Pozdrawiam.

0

A gdzie ustawiasz ten rok, miesiąc, dzień?

0

Z tego co rozumiem z książki to powinno wyświetlić mi podane w tablicy obsluga daty zatrudnienia pracowników. Program jednak wyświetla mi wszędzie datę ostatniej kompilacji kody.
Dlaczego tak się dzieję?

Bo tak temu kodowi kazałeś robić.

GregorianCalendar kalendarz = new GregorianCalendar();
dzienZatrudnienia = kalendarz.getTime();

Nie znam javy a mimo to zgadłem co ten kod robi.

0

iooi,
obsluga[0] = new Pracownik ("Jan", "Kowalski", 1000, 2010, 3, 5);
obsluga[1] = new Pracownik ("Anna", "Kowalska", 2000, 2011, 5, 6);
obsluga[2] = new Pracownik ("Rafał", "Kowalski", 3000, 2010, 5, 30);
obsluga[3] = new Pracownik ("Agata", "Kowalska", 1500, 2012, 6, 28);
^
obsluga[i] = new Pracownik ("imie", "nazwisko", pensja przed podwyżką, rok, miesiąc, dzień);

-123oho,
szczerze Tobie powiem, że też mi trochę nie pasuje ten kod - tak na chłopski rozum. Czytam książkę, później piszę program który jest w książce a następnie oba porównuje. Napisany przeze mnie jest praktycznie identyczny z tym z książki (za wyjątkiem kilku usprawnień, do których wykorzystałem opanowaną wcześniej wiedzę w ramach ćwiczeń). Części z datą zatrudnienia nie zmieniałem w ogóle.

0

szczerze Tobie powiem, że też mi trochę nie pasuje ten kod - tak na chłopski rozum. Czytam książkę, później piszę program który jest w książce a następnie oba porównuje. Napisany przeze mnie jest praktycznie identyczny z tym z książki (za wyjątkiem kilku usprawnień, do których wykorzystałem opanowaną wcześniej wiedzę w ramach ćwiczeń). Części z datą zatrudnienia nie zmieniałem w ogóle.

To są trzy możliwości:
a) nie umiesz przepisywać kodu (co moim zdaniem samo w sobie jest bez sensu)
b) w książce jest błąd
c) tobie się wydaje że kod powinnien robić coś innego niż w książce jest napisane że robi
Zgaduję że poprawna jest odpowiedź D, czyli 'wszystko naraz'.

A twoja odpowiedź dla @iooi jest bez sensu bo to że wysyłasz to do konstruktora nie znaczy że magicznie się to gdzieś zapisuje.

Zresztą, pytałeś dlaczego, więc wątek jest rozwiązany z bardzo prostym powodem: Program robi to co ma zapisane, nie to czego oczekuje programista.

0

Problem właśnie rozwiązałem. W czasie poprawiana programu usunąłem przez przypadek argumenty obiektu GregorianCalendar w konstruktorze klasy Pracownik. Właśnie dodałem je z powrotem i program działa jak powinien. Wcześniej wpisałem je w złej kolejności. Zamiast usunąć je i wpisać poprawną kolejność zostawiłem puste nawiasy ().
No nic, nauka na przyszłość: bardziej uważać :)

@add:
Nie mogę edytować pierwszego postu, a więc napiszę tutaj. Poprawnie konstruktor powinien wyglądać tak:

public Pracownik(String i, String n, double p, int rok, int miesiac, int dzien) {
                imie = i;
                nazwisko = n;
                pensja = p;
                GregorianCalendar kalendarz = new GregorianCalendar(rok, miesiac, dzien);
                dzienZatrudnienia = kalendarz.getTime();
        }
0
GregorianCalendar kalendarz = new GregorianCalendar();
                dzienZatrudnienia = kalendarz.getTime();

Jak to się ma do tych parametrów, które przekazujesz w konstruktorze ? ;)

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