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

Początki programowania obiektowego.

Aruba Cloud - Virtual Private Server VPS
+1 głos
447 wizyt
pytanie zadane 13 grudnia 2021 w Java przez xTMx3 Obywatel (1,560 p.)

Witam,

w miejscu gdzie uczę się programowania wchodzimy właśnie w temat programowania obiektowego. Nigdy dotąd tego jeszcze nie robiłem i jest to dla mnie dosyć duża nowość przez co mam problemy z pewnym zadaniem, które dostałem do wykonania. Otóż, muszę zdefiniować klasę "Samochód" zawierającą :

pola prywatne : int vMax 

                         double paliwoWzbiorniku, zuzyciePaliwaNa100km

Metody:

metody dostępowe do pól prywatnych,

dwa konstruktory ( jeden bez parametrów, inicjujący pola domyślnymi wartościami dowolnie przyjętymi oraz drugi z trzema parametrami vMax, paliwoWzbiorniku oraz zuzyciePaliwaNa100km )

double zasieg() - obliczającą ile można przejechać na paliwie w zbiorniku

double czasDojazdu(double dystans) - obliczającą ile zajmie dojazd zakładając średnią prędkość wynoszącą 3/4 vMax

void zatankuj(double ilePaliwaZatankowano) - zwiększającą liczbę paliwa w zbiorniku zgodnie z wartością parametru

void trasa(double liczbaKilometrów) - zmniejszającą liczbę paliwa w zbiorniku zgodnie z liczbą przejechanych kilometrów

Do tej pory napisałem coś takiego:

package obiektyzadanie1;

import java.util.Scanner;

public class ObiektyZadanie1 {

    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        System.out.print("Podaj maksymalną prędkość samochodu: "); int V = sc.nextInt();
        System.out.print("Podaj ile jest paliwa w zbiorniku: "); double paliwo = sc.nextDouble();
        System.out.print("Podaj jakie jest zużycie paliwa na 100km: "); double zuzycie = sc.nextDouble();
        
        Samochod auto = new Samochod(); // Tutaj pojawia się problem
    }

    class Samochod {

        private int vMax;
        private double paliwoWZbiorniku, zuzycieNa100km;

        public Samochod() {
            this.vMax = 120; paliwoWZbiorniku = 35.0; zuzycieNa100km = 5.0;
        }

        public Samochod(int V, double paliwo, double zuzycie) {
            this.vMax = V;
            this.paliwoWZbiorniku = paliwo;
            this.zuzycieNa100km = zuzycie;
        }

        public double zasieg() {
            return (paliwoWZbiorniku / zuzycieNa100km) * 100;
        }

        public double czasDojazdu(double dystans) {
            return ((3 * vMax) / 4) / dystans;
        }

        void zatankuj(double ilePaliwaZatankowano) {
            System.out.println("Zatankowano: " + ilePaliwaZatankowano);
            paliwoWZbiorniku += ilePaliwaZatankowano;
        }
        
        void trasa(double liczbaKilometrow){
            paliwoWZbiorniku = (100*paliwoWZbiorniku)/(zuzycieNa100km*liczbaKilometrow);
            System.out.println("Po przejechaniu "+liczbaKilometrow+"km zostanie "+paliwoWZbiorniku+"l paliwa.");
        }
        
        /**
         * @return the vMax
         */
        public int getvMax() {
            return vMax;
        }

        /**
         * @return the paliwoWZbiorniku
         */
        public double getPaliwoWZbiorniku() {
            return paliwoWZbiorniku;
        }

        /**
         * @return the zuzycieNa100km
         */
        public double getZuzycieNa100km() {
            return zuzycieNa100km;
        }
    }
}

Napisałem do tej pory coś takiego, ale próbując jakoś sprawdzić działanie tego kodu już w momencie kiedy próbuję stworzyć nowy obiekt wyskakuje mi błąd "non-static variable cannot be referenced from a static context". 

Czy mógłby ktoś wytłumaczyć mi jak dokładnie działa to wszystko i co powoduje ten błąd oraz co muszę zrobić, żeby to naprawić? 

1 odpowiedź

+1 głos
odpowiedź 13 grudnia 2021 przez Wiciorny Ekspert (279,870 p.)
wybrane 13 grudnia 2021 przez xTMx3
 
Najlepsza

Klasa Samochód jest wewnętrzną klasa -> znajduje się w środku ObiektyZadanie1 -> to jest klasa zewnętrzna. 
Więc jest "elementem", częściom tej klasy stąd taki zapis : 

  Samochod auto = new Samochod();

jest nieprawidłowy, dlatego że w metodzie statycznej - klasy  ObiektyZadanie1 tworzysz wewnętrzny obiekt Samochód, który nie należy do klasy, a instacji klasy ObiektyZadanie1

Możesz to rozwiązać na kilka sposobów, albo klase samochód oznaczyć publiczną, jako osobną klase a nie wewnątrz obecnej klasy, albo oznaczyc klasę jako 

static class Samochod

niesie to ze sobą jednak ISTOTNĄ RÓŻNICE, gdyż statyczna klasa samochód jest związana z klasą ObiektyZadanie1  a nie z samą jej instancją "czyli obiektem".

inny sposób to po prostu odwołanie się do utworzenia obiektu na rzecz klasy więc jeśli klasa Samochód jest związana Z OBIEKTEM A NIE KLASĄ, BO NIE JEST STATYCZNA, TO ABY UTWORZYĆ SAMOCHÓD MUSISZ MIEĆ OBIEKT klasy ObiektyZadanie1

 Samochod auto = new ObiektyZadanie1().new Samochod();

//inaczej zapisac mozesz 

ObiektyZadanie1 zadanie = new ObiektyZadanie1(); //tworzysz obiekt zadania 
Samochod auto2 = zadanie.new Samochod(); // tworzysz samochód 

 

komentarz 13 grudnia 2021 przez xTMx3 Obywatel (1,560 p.)
Żeby ominąć całkowicie ten błąd w jeszcze prostszy ( a przynajmniej wydaje mi się, że prostszy ) sposób, mógłbym po prostu "wyjąć" klasę Samochód z klasy ObiektyZadanie1, czy wiązało się to będzie z jakimiś nieprawidłowościami? ( kiedy robię to w swoim kodzie, błąd znika )
1
komentarz 13 grudnia 2021 przez Wiciorny Ekspert (279,870 p.)
to Ci napisałem na samym początku, po prostu umieścić klasę jako osobną.
Nie ma to znaczenia, klasa jest szablonem- akurat twój program ObiektyZadanie1 jako klasa ma służyć tylko do uruchomienia rozumiem u Ciebie zadania.
1
komentarz 13 grudnia 2021 przez xTMx3 Obywatel (1,560 p.)
Skoro tak, to chyba załapałem cały zamysł. Dziękuję za pomoc

Podobne pytania

0 głosów
3 odpowiedzi 1,249 wizyt
pytanie zadane 11 grudnia 2016 w C i C++ przez Pan Piguła Nowicjusz (130 p.)
0 głosów
1 odpowiedź 533 wizyt
0 głosów
1 odpowiedź 264 wizyt

93,281 zapytań

142,285 odpowiedzi

322,304 komentarzy

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...