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

Programowanie obiektowe w Javie

Object Storage Arubacloud
0 głosów
160 wizyt
pytanie zadane 9 września 2020 w Java przez Jonasz Nowicjusz (230 p.)
package com.company;

public class Main {


    public static void main(String[] args) {
        
        Iddrivingtest drivingtest= new Drivingtest(new BMW());
    }
}


interface Auto {

    void drive();
}


public class BMW implements Auto{
    Auto sam1;
    BMW sam2;
    @Override
    public void drive() {

        System.out.println("bmw drive");

    }
}


public interface Iddrivingtest {
    void test();
}


public class Drivingtest implements Iddrivingtest {
    private Auto auto;

    public Drivingtest(Auto auto)
    {

        this.auto=auto;

    }
    @Override
    public void test() {
    auto.drive();

    }
}

 

Właśnie oglądam poradnik na temat javy i nie rozumiem paru rzeczy.

1.W klasie Drivingtest jest pole private Auto auto;

Auto to typ, a auto to klasa?? Czemu nie jest to zdefiniowane w taki sposób

Auto auto= new Auto;

2.W klasie Drivingtest, metodzie test pole: auto.drive(); Czemu auto może wykonać metode skoro nie ma

Auto auto= new Auto;

3.W klasie Main czemu jest akurat tak:

Iddrivingtest drivingtest= new Drivingtest(new BMW());

a nie np tak, czym to sie różni. Jakie ma znaczenie to że typem bedzie raz Interfejs, a raz klasa która implementuje dany interfejs?:

Drivingtest drivingtest = new Drivingtest(new BMW());

1 odpowiedź

0 głosów
odpowiedź 9 września 2020 przez senpai desu Mądrala (5,720 p.)
wybrane 9 września 2020 przez Jonasz
 
Najlepsza

konstruktor przyjmuje gotowy obiekt i przypisuje do tego pola

Iddrivingtest drivingtest= new Drivingtest(new BMW()); -- ten wiersz uruchamia konstruktor klasy Drivingtest

 public Drivingtest(Auto auto){
         this.auto=auto;
 }

jeśli klasa implementuje interfejs to spełnia dany kontrakt (posiada wymagane metody - wiec będzie działać zgodnie z planem) obiekt Main będzie mógł wywołać metody dowolnego obiektu spełniającego kontrakt /implementującego interfejs Auto 

 

komentarz 9 września 2020 przez Jonasz Nowicjusz (230 p.)

jeśli klasa implementuje interfejs to spełnia dany kontrakt (posiada wymagane metody - wiec będzie działać zgodnie z planem)

już nie trzeb robic  Auto auto= new Auto; ?

 

komentarz 9 września 2020 przez senpai desu Mądrala (5,720 p.)

Auto auto= new Auto;  to się oczywiście dzieje tylko za pomocą tego co zamieściłem wcześniej.

Iddrivingtest drivingtest= new Drivingtest(new BMW()); //ten wiersz tworzy obiekty i uruchamia konstruktor poniżej
 
public Drivingtest(Auto auto)   {
     this.auto=auto;
}
komentarz 9 września 2020 przez Jonasz Nowicjusz (230 p.)

wybacz, ale nic nie rozumiem z tego co mówisz, jesli masz siłe jeszcze mi tłumaczyć to prosze byś każdą odpowiedz oznaczył numerami do każdego mojego pytania. Nie rzucaj odpowiedzi skrótowo, jestem początkującym :/

 

 Auto auto= new Auto;  to się oczywiście dzieje tylko za pomocą tego co zamieściłem wcześniej.

Co zamieściłem wczesniej?? to co wkleiłem to wszystko co napisałem, nie ma wczesniejszych rzeczy

komentarz 9 września 2020 przez senpai desu Mądrala (5,720 p.)
edycja 9 września 2020 przez senpai desu

1 Auto to typ zmiennej  a auto to obiekt w tym przypadku obiekt musi implementować interfejs

to tylko deklaracja zmiennej nie ma potrzeby od razu robić przypisania = new ta operacja jest wykonywana przez konstruktor klasy Drivingtest:

public Drivingtest(Auto auto)   {
     this.auto=auto;
}

-----------------------------

2 wszystkie klasy implementujące interfejs Auto mają tą metodę,

nie jest istotne jaki to obiekt pod warunkiem, że implementuje ten interfejs 

tak jak pisałem wcześniej 

Iddrivingtest drivingtest= new Drivingtest(new BMW()); tu masz przypisanie obiektu do tego pola: Auto auto;,  tylko za pomocą konstruktora,

--------------------------

3 wykorzystanie interfejsów/ implementacji pozwala na użycie dowolnego obiektu implementującego interfejs nie jest ważne z jakiej klasy jest obiekt 

w przypadku wykorzystania nazwy klasy Drivingtest  nie wymuszamy istnienia/implementacji, interfejsu,  wykorzystując Iddrivingtest jako typ mamy gwarancje, że wykorzystany obiekt implementuje tą metodę test() 

interfejsy to forma wymuszenia zgodności więc nie dojdzie do sytuacji, że wykorzystasz obiekt niespełniający wymagań / nieposiadający wymaganych metod

nie łatwo zrozumieć jest te rzeczy, w pewnym momencie "zaskoczysz"

komentarz 9 września 2020 przez Jonasz Nowicjusz (230 p.)

teraz rozumiem, dzięki laugh

 

Podobne pytania

0 głosów
5 odpowiedzi 1,165 wizyt
pytanie zadane 25 lipca 2018 w PHP przez Luna Cognita Dyskutant (8,130 p.)
0 głosów
1 odpowiedź 179 wizyt
0 głosów
1 odpowiedź 90 wizyt

92,623 zapytań

141,478 odpowiedzi

319,818 komentarzy

62,005 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!

...