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

Początki programowania obiektowego.

Object Storage Arubacloud
+1 głos
337 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 (270,590 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 (270,590 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,091 wizyt
pytanie zadane 11 grudnia 2016 w C i C++ przez Pan Piguła Nowicjusz (130 p.)
0 głosów
1 odpowiedź 450 wizyt
0 głosów
1 odpowiedź 199 wizyt

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 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!

...