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

Java gdzie robie bład?

VPS Starter Arubacloud
0 głosów
353 wizyt
pytanie zadane 6 lutego 2018 w Rozwój zawodowy, nauka, praca przez Pus_Tako_sy Początkujący (320 p.)
edycja 6 lutego 2018 przez Pus_Tako_sy



import java.util.Scanner;

public class Bankomat {
    public static void main (String args[])
    {
        Karta kata=new Karta();
        TwojaKarta karta = new TwojaKarta();
        karta.getnrKarty();
        boolean dobryWybor;
        boolean zlaOpcja;
        System.out.print("wlóż karte i podaj nr karty: ");
        Scanner odczyt = new Scanner(System.in);

        while (true)
        {
            String nrKarty = odczyt.nextLine();
            if(nrKarty.equals(karta.getnrKarty()))
            {
                System.out.println("stan konta wynosi: "+karta.getStanKonta()+" zł");
                System.out.println("co chcesz zrobic ze swoimi pi1eniedzmi");
                System.out.println("1.wypłać");
                System.out.println("2.wpłać");
                break;
            }
            else
                System.out.println("zły nr karty, sprobuj jeszcze raz:");
          if(nrKarty.equals("exit"))
            {
                System.exit(0);
            }
        }
        String wybor = odczyt.nextLine();
        switch (wybor) {
            case "1":
                Wypłacanie.wyplac();
                break;
            case "2":
                Wpłacanie.wplac();
                label:
                while (true)
                {
                    System.out.println("chcesz wplacic pieniądze jeszcze raz? T/n");
                    String chcesz = odczyt.nextLine();
                    switch (chcesz) {
                        case "T":
                            Wpłacanie.wplac();
                            break;
                        case "n":
                            break label;
                        default:
                            System.out.println("podałes zla opcje");
                            break;
                    }
                }
                break;
            default:
                System.out.println("wybrałes nieprawidłową opcje");
                break;
        }
    }
}

Klasa Wpłacanie

import java.util.Scanner;


class Wpłacanie {
    public static void wplac()
    {
        // String myString = "1234";
        // int foo = Integer.parseInt(myString);

        Scanner odczyt = new Scanner(System.in);
        TwojaKarta twojaKarta = new TwojaKarta();

        {
        System.out.println("aktualnie posziadasz: " + twojaKarta.getStanKonta() + "zł");
        System.out.println("Podaj kwote jaka chcesz wpłacić do banku: ");

        String kwotaDoDodania = odczyt.nextLine();
        int kwotaDoDodaniaint = Integer.parseInt(kwotaDoDodania);

        twojaKarta.setStanKonta(kwotaDoDodaniaint + twojaKarta.getStanKonta());

        System.out.println("po wpłacie posziadasz: " + twojaKarta.getStanKonta() + "zł");



        }


    }
}

 

twojaKarta

public class TwojaKarta  {

    public int stanKonta =1337;
    private final String nrKarty = "123";

    public String getnrKarty()
    {
        return nrKarty;
    }
    public void setStanKonta(int stanKonta)
    {
        this.stanKonta=stanKonta;
    }
    public int getStanKonta()
    {
        return stanKonta;
    }
}

wlóż karte i podaj nr karty: 123
stan konta wynosi: 1337 zł
co chcesz zrobic ze swoimi pi1eniedzmi
1.wypłać
2.wpłać
2
aktualnie posziadasz: 1337zł
Podaj kwote jaka chcesz wpłacić do banku: 
123
po wpłacie posziadasz: 1460zł
chcesz wplacic pieniądze jeszcze raz? T/n
T
aktualnie posziadasz: 1337zł
Podaj kwote jaka chcesz wpłacić do banku: 
31
po wpłacie posziadasz: 1368zł
chcesz wplacic pieniądze jeszcze raz? T/n

stanKonta powraca to pierwotnej wartosci 

komentarz 7 lutego 2018 przez Patrycjerz Mędrzec (192,340 p.)
To pytanie jest poniżej wszelkich standardów, dostajesz ostrzeżenie, proszę nie robić tak więcej.

1 odpowiedź

+2 głosów
odpowiedź 7 lutego 2018 przez Frearexis Użytkownik (540 p.)
wybrane 8 lutego 2018 przez Pus_Tako_sy
 
Najlepsza

TL;DR Poczytaj o słowie kluczowym static i konstruktorach .

W Twoim wypadku problem występuje ponieważ pole stanKonta klasy TwojaKarta zostaje ustawione na 1337zł za każdym razem gdy tworzysz nowy obiekt klasy TwojaKarta.

Gdyby stanKonta był zadeklarowany 

public static int stanKonta =1337;

to wartość którą mu nadałeś zostałaby wspólna dla wszystkich obiektów klasy TwojaKarta co oczywiście też jest złe bo użytkownicy dodawaliby pieniądze do wspólnego konta. U Ciebie wygląda to w tym momencie tak, że tworzysz w metodzie main obiekt TwojaKarta a w metodzie wpłać inny obiekt TwojaKarta. Jeśli chcesz przekazać do innej klasy dokładnie ten sam obiekt musisz użyć konstruktora w takim wypadku kod musiałbyś zmienić tak:

class Wpłacanie {

private TwojaKarta karta;

public Wpłacanie(TwojaKarta karta){

this.karta = karta;

}

  a w metodzie wpłać odnosić się po referencji karta.

Natomiast by stworzyć obiekt Wpłacanie

Wpłacanie wpłacanie = new Wpłacanie(karta)

Postaraj się też używać nazw angielskich dla pól i metod oraz rozbijać program na mniejsze funkcje a wszystko będzie szło ku dobremu :)

komentarz 7 lutego 2018 przez Wiciorny Ekspert (269,120 p.)

W Twoim wypadku problem występuje ponieważ pole stanKonta klasy TwojaKarta zostaje ustawione na 1337zł za każdym razem gdy tworzysz nowy obiekt klasy TwojaKarta.

 Static- nie jest związany z obiektem, a z  Klasą :) jeśli poprzednie obiekty zmienią wartość tej zmiennej, to ona przy tworzeniu kolejnych będzie inna. 

komentarz 7 lutego 2018 przez Frearexis Użytkownik (540 p.)
Przecież dokładnie to opisuję dalej.
komentarz 7 lutego 2018 przez Wiciorny Ekspert (269,120 p.)
ale to stwierdzenie które cytuje, jest błędne :) czytaj do czego się odnoszę. Nie twierdze, że to co później piszesz jest złe, nieprawdziwe. Ale stwierdzenie na początku wprowadza w błąd.
komentarz 7 lutego 2018 przez Frearexis Użytkownik (540 p.)
A Ty czytaj kod do którego się odnoszę w zacytowanej części. Przecież na początku opisuję sytuację którą ma w kodzie i która powoduje błąd - nie ma static na polu stanKonta. Zobacz jego kod jeszcze raz.
komentarz 7 lutego 2018 przez Wiciorny Ekspert (269,120 p.)

TwojaKarta zostaje ustawione na 1337zł za każdym razem gdy tworzysz nowy obiekt klasy TwojaKarta.

ja sie tego czepiam... to jest BZDURA co Ty napisałeś, a nie prawda. Jeśli jego pole jest STATYCZNE to nie " zostaje ustawione za każdym razem jak tworzy obiekt"... klasy. Bo ***** STATIC nie zależy od instancji. To pole jest stworzone raz w momencie załadowania klasy przez JVM. Dlatego chyba sam nie rozumiesz pojęcia static, a przez takie stwierdzenia, potem  jak mam kogoś na rozmowie to właśnie słysze takie bzdury

komentarz 7 lutego 2018 przez Frearexis Użytkownik (540 p.)

Ale jego pole nie jest statyczne i na początku swojej wypowiedzi nie mówię o słowie static tylko odnosze się do kodu który zamieścił czyli do tego:

public class TwojaKarta  {
 
    public int stanKonta =1337;
    private final String nrKarty = "123";
 
    public String getnrKarty()

powiedz mi gdzie tu jest static? Więc to co zacytowałeś 

W Twoim wypadku problem występuje ponieważ pole stanKonta klasy TwojaKarta zostaje ustawione na 1337zł za każdym razem gdy tworzysz nowy obiekt klasy TwojaKarta.

Jest jak najbardziej poprawne (jak zresztą cała reszta mojej wypowiedzi). Może gdybyś więcej czasu poświęcił na czytanie ze zrozumieniem a nie na klepanie postów pod ilość zrozumiałbyś co tu zostało napisane.  

Podobne pytania

0 głosów
0 odpowiedzi 191 wizyt
pytanie zadane 17 czerwca 2017 w C i C++ przez PClove Początkujący (310 p.)
0 głosów
1 odpowiedź 3,420 wizyt
pytanie zadane 9 maja 2017 w Java przez Milesq Nałogowiec (32,020 p.)
0 głosów
2 odpowiedzi 1,778 wizyt
pytanie zadane 6 marca 2019 w Java przez krystian1997 Obywatel (1,020 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...