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

Dlaczego jest taki wynik programu ?

Cloud VPS
0 głosów
203 wizyt
pytanie zadane 18 września 2016 w Java przez timati Bywalec (2,060 p.)

Witam, czy ktoś z użytkowników tego forum byłby wstanie wytłumaczyć mi wyniki poniższego programu ?

Debugowałem kilka razy program, lecz nie mam pojęcia skąd się niektóre wyniki biorą. Czasami zapamiętuje wartość a, czasami c a nie wiem dlaczego tak się dzieje...


public class A {
    static int c =7;
    int a =0;
    public A(){
        c=c+2;
        a=c;
    }
    public int m(int x){
        return a *--x;
    }
}



public class B extends A {
    int a = 13;
    static int c =1;
    public B(){
        c =c*3;
        a=c;
    }
    public int m(int x){
        return --a*++x;
    }
    public static void main(String[] args){
        A o1 = new A();
        A o2 = new B();
        B o3 = new B();
        System.out.println("o1.a = " + o1.a);
        System.out.println("o1.m(o1.a) = " + o1.m(o1.a));
        System.out.println("o1.a = " + o1.a);
        System.out.println("c = " + c);
        System.out.println("o2.a = " + o2.a);
        System.out.println("o2.m(5) = " + o2.m(5));
        System.out.println("o2.a = " + o2.a);
        System.out.println("c = " + c);
        System.out.println("o3.a = " + o3.a);

    }

 

komentarz 18 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
Na JAvie sie nie znam, ale popatrz co robisz w klasie. Podales wartosc zmiennej c=7 i jest stala, a pozniej robisz tak ze c=c+2, chociaz c ma w sobie static, jezeli zle mowie to idziemy dalej. Masz c=7 i pozniej c=c+2 a pozniej mowisz ze a=c, ale z ktorym c, bo 1 c mowi ze jest rowne 7, a drugie ze 9.... Program wariuje... ´Nie jest to odpowiedz bo jestem za zielony jeszcze i nie wiem czy dobrze mwoie, z tego powodu poczekaj na innych. W c++ robil bym wskaznic na c

1 odpowiedź

+1 głos
odpowiedź 18 września 2016 przez Trucik Obywatel (1,130 p.)

No to jedziemy... Nie  mniej fajnie jakbyśnapisał, który konkretnie wynik Cię dziwi.

 

            System.out.println("o1.a = " + o1.a);

Wyświetla pole a z klasy A, które nadawane jest w konstruktorze tej klasy:

  public A(){
        c=c+2;
        a=c;
    }

c inicjalizowane jest jako 7 i do tego jest polem statycznym dla każdej instancji o1 oraz o2 są to te same pola! JEDNO WSPÓLNE! StackTrace zatem to:

c=7 c+2 a=c wynika z tego a=9
            System.out.println("o1.m(o1.a) = " + o1.m(o1.a));

do metody m(int x) przekazujemy wartość 9 opisane skąd to się wzięło powyżej. Metoda m(int 9) mnoży pole a (samej siebie) razy to co dostała w argumencie(uprzedmio odejmując 1) zatem stacktrace:

a=9 argument x=9 dalej od x-1 wynik 9*8 = 72
            System.out.println("o1.a = " + o1.a);

tutaj wciąż mamy 9 bo nie robiliśmy zmian na naszym obiekcie o1 (a dokładnie jakie polu a)
            System.out.println("c = " + c);

Tu odwołujemy się do pola c, ale jest to pole statyczne. jako że klasa B rozszerza klasę A jest to dokładnie to samo pole statyczne i jest wciąż równe 9
            System.out.println("o2.a = " + o2.a);

o2 jest tworzony przez konstruktor klasy A, skoro c=9, a+2=11
            System.out.println("o2.m(5) = " + o2.m(5));

pole a = 11 więc 11 * 4 = 44. Niestety tak się nie wyświetla. Dzieje się tak ponieważ zarówno klasa A jak i rozszerzająca ją klasa B ma pole o takiej samej nazwie. I TO JEST IDIOTYCZNE! NIE RÓB TAK NIGDY! metoda m wywoływana jest na klasie A zatem do obliczeń brane jest pole a klasy A nie jak by można przypuszczać pole a klasy B. 

Wartość pola a klasy A w obiekcie o2 równe jest 3, a wynika to z konstruktora klasy rozszerzającej B.
            System.out.println("o2.a = " + o2.a);

to zostało juz wcześniej opisane. Gdybyś chciał się przekonać jaka jest wartość pola a
            System.out.println("c = " + c);

No tutaj to bez zmian
            System.out.println("o3.a = " + o3.a);

W momencie tworzenia tego obiektu pole c miało wartość 3, nie 9 jak obecnie dlatego wartość pola a jest równa 9 co wynika z konstruktora.

 

Mam nadzieję, że pomogłem nie mniej nie twórz NIGDY pól o takiej samej nazwie. Namierzenie błędów staje się niemożliwe w rozbudowanych aplikacjach. Jeśli jakiś nauczyciel wam daje coś takiego to powiedź mu, że programowanie obiektowe nie zostało stworzone po to by męczyć idiotycznymi zawiłościami algebraicznymi uczniów. 

Podobne pytania

0 głosów
2 odpowiedzi 934 wizyt
pytanie zadane 12 grudnia 2018 w Java przez must Bywalec (2,980 p.)
0 głosów
1 odpowiedź 156 wizyt
pytanie zadane 17 lutego 2018 w Java przez konrad99 Gaduła (4,090 p.)
0 głosów
2 odpowiedzi 461 wizyt
pytanie zadane 3 stycznia 2020 w C i C++ przez damiang19 Nowicjusz (220 p.)

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,838 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

Kursy INF.02 i INF.03
...