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

Programowanie obiektowe w Javie

0 głosów
519 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,786 wizyt
pytanie zadane 25 lipca 2018 w PHP przez Luna Cognita Dyskutant (8,130 p.)
0 głosów
1 odpowiedź 405 wizyt
0 głosów
1 odpowiedź 226 wizyt

93,741 zapytań

142,677 odpowiedzi

323,294 komentarzy

63,324 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...