Wiem, że tego rodzaju pytania został poproszony wcześniej , ale nadal czuję, że odpowiedź jest zbyt niejasny dla mnie (i co za tym idzie, niektóre / większość początkujących) do uchwycenia.
Próbowałem nauczyć się szerszych koncepcji programowania niż proceduralne i podstawowe OOP. Rozumiem konkretne koncepcje OOP (tworzysz klasę, która ma dane (składowe) i funkcje (metody), a następnie tworzysz instancję tej klasy w czasie wykonywania, aby faktycznie robić rzeczy, tego rodzaju rzeczy).
Myślę, że mam pojęcie o tym, czym jest klasa ( rodzaj projektu projektu instancji, która ma być utworzona na jej podobieństwo w czasie kompilacji ). Ale jeśli tak jest, czym jest obiekt? Wiem również, że w językach opartych na prototypach może to jeszcze bardziej zepsuć sytuację, ale być może dlatego w moim umyśle musi istnieć wyraźne rozróżnienie między obiektem a instancją.
Poza tym zmagam się z pojęciami „obiektu” i „instancji”. Wiele zasobów, które czytałem (w tym odpowiedzi w SO), mówi, że są one w dużej mierze takie same i że różnica polega na semantyce. Inni ludzie mówią, że istnieje między nimi prawdziwa różnica pojęciowa.
Czy eksperci w SO mogą pomóc początkującym mieć ten moment „aha”, aby przejść do przodu w świecie OOP?
Uwaga: to nie jest praca domowa, nie chodzę do szkoły - jednak myślę, że pomogłoby to osobom, które szukają pomocy w odrabianiu lekcji.
Odpowiedzi:
Plan projektu domu jest jak opis klasy. Wszystkie domy zbudowane z tego projektu są obiektami tej klasy. Przykładem jest dany dom.
źródło
Prawda jest taka, że programowanie obiektowe często powoduje zamieszanie, tworząc rozdźwięk między filozoficzną stroną rozwoju a faktycznymi mechanicznymi działaniami komputera. Spróbuję zestawić te dwa dla Ciebie:
Podstawowa koncepcja OOP jest następująca: Klasa >> Obiekt >> Instancja.
Klasa = niebieski nadruk. Obiekt jest rzeczywistą rzeczą zbudowaną w oparciu o „niebieski druk” (jak dom). Instancja to wirtualna kopia (ale nie rzeczywista kopia) obiektu.
Bardziej technicznym wyjaśnieniem „instancji” jest to, że jest to „odniesienie do pamięci” lub zmienna odniesienia. Oznacza to, że „instancja” jest zmienną w pamięci tylkoma adres pamięci obiektu w nim. Obiekt, do którego się odnosi, jest tym samym obiektem, o którym mówi się, że instancja jest „instancją”. Jeśli masz wiele instancji obiektu, tak naprawdę masz po prostu wiele zmiennych w różnych miejscach w pamięci, z których wszystkie mają ten sam dokładny adres pamięci - wszystkie są adresami tego samego dokładnego obiektu. Nie możesz nigdy „zmienić” instancji, chociaż wygląda na to, że możesz to zrobić w swoim kodzie. To, co naprawdę robisz, gdy „zmieniasz” instancję, to bezpośrednia zmiana oryginalnego obiektu. Elektronicznie, procesor przechodzi przez jedno dodatkowe miejsce w pamięci (zmienna / instancja odniesienia), zanim zmieni dane oryginalnego obiektu.
Proces jest następujący: procesor >> lokalizacja w pamięci instancji >> lokalizacja w pamięci oryginalnego obiektu.
Pamiętaj, że nie ma znaczenia, której instancji używasz - wynik końcowy zawsze będzie taki sam. WSZYSTKIE instancje będą nadal przechowywać te same dokładne informacje w swoich lokalizacjach pamięci - adres pamięci obiektu - i tylko obiekt się zmieni.
Związek między klasą a przedmiotem jest nieco bardziej zagmatwany, choć filozoficznie jest najłatwiejszy do zrozumienia (blue print >> house). Jeśli obiekt to rzeczywiste dane przechowywane gdzieś w pamięci, czym jest „klasa”? Okazuje się, że mechanicznie obiekt jest dokładną kopią klasy. Tak więc klasa jest po prostu kolejną zmienną w innym miejscu w pamięci, która zawiera dokładnie te same informacje, co obiekt. Zwróć uwagę na różnicę między relacjami:
Obiekt jest kopią klasy. Instancja to zmienna przechowująca adres pamięci obiektu.
Możesz również mieć wiele obiektów tej samej klasy, a następnie wiele wystąpień każdego z tych obiektów. W takich przypadkach zestaw wystąpień każdego obiektu ma taką samą wartość, ale wystąpienia między obiektami nie. Na przykład:
Niech klasa A z klasy A niech Object1, Object2 i Object3.
// Object1 ma dokładnie taką samą wartość jak object2 i object3, ale znajdują się w różnych miejscach w pamięci.
from Object1 >> let obj1_Instance1, obj1_Instace2, obj1_Instance3
// wszystkie te instancje są również równoważne pod względem wartości i znajdują się w różnych miejscach w pamięci. Ich wartości = Object1.MemoryAddress.
itp.
Kiedy zaczynasz wprowadzać typy, sprawy stają się bardziej skomplikowane. Oto przykład przy użyciu typów z języka C #:
// załóżmy, że klasa Person istnieje Person john = new Person ();
Właściwie ten kod jest łatwiejszy do przeanalizowania, jeśli podzielisz go na dwie części:
Mówiąc językiem technicznym, pierwsza linia „deklaruje zmienną typuOsoba. Ale co to znaczy ?? Ogólne wyjaśnienie jest takie, że mam teraz pustą zmienną, która może zawierać tylko obiekt Person. Ale chwileczkę - to pusta zmienna! Nie ma nic w tej lokalizacji pamięci zmiennych. Okazuje się, że „typy” nie mają znaczenia mechanicznego. Typy zostały pierwotnie wymyślone jako sposób zarządzania danymi i nic więcej. Nawet jeśli deklarujesz typy pierwotne, takie jak int, str, chr (bez inicjalizacji), na komputerze nic się nie dzieje. Ten dziwny, składniowy aspekt programowania jest częścią tego, skąd ludzie myślą, że klasy są planem obiektów. OOP są jeszcze bardziej mylące z typami z typami delegatów, programami obsługi zdarzeń itp. Starałbym się nie skupiać na nich zbytnio i po prostu pamiętać, że wszystkie są mylące.
Druga linia również jest nieco zagmatwana, ponieważ robi dwie rzeczy naraz:
Pierwsza z prawej strony „nowa osoba ()” jest oceniana. Tworzy nową kopię klasy Person - to znaczy tworzy nowy obiekt.
Następnie sprawdzana jest lewa strona „john =”. Zamienia john w zmienną referencyjną, podając adres pamięci obiektu, który właśnie został utworzony po prawej stronie tego samego wiersza.
Jeśli chcesz zostać dobrym programistą, ważne jest, aby zrozumieć, że żadne środowisko komputerowe nigdy nie działa w oparciu o ideały filozoficzne. Komputery nie są nawet tak logiczne - to po prostu duży zbiór przewodów sklejonych ze sobą za pomocą podstawowych obwodów logicznych (głównie NAND i OR).
źródło
Słowo Class pochodzi z Klasyfikacji ( A kategoria , do której coś się położyć ), teraz mamy wszystko słyszał, że klasa jest jak plan, ale co to dokładnie oznacza? Oznacza to, że klasa zawiera opis konkretnej kategorii ( chciałbym pokazać różnicę między klasą, obiektem i instancją na przykładzie z użyciem języka Java i poprosiłbym czytelników o wizualizację jej jako historii podczas czytania, a jeśli nie są zaznajomieni z java nie ma znaczenia ) Zacznijmy od stworzenia Kategorii o nazwie HumanBeing , więc program Java będzie to wyrażał w następujący sposób
Teraz, jakie atrybuty ma człowiek , ogólnie rzecz biorąc, imię , wiek , wzrost , waga ograniczmy się teraz do tych czterech atrybutów, dodajmy to do naszej kategorii
Teraz każda kategoria ma zachowanie, na przykład kategoria Pies zachowuje się szczekać, aportować, przewracać itp., Podobnie nasza kategoria HumanBeing może również zachowywać się w określony sposób, na przykład gdy pytamy naszego HumanBeing o Twoje imię / wiek / wagę / wysokość? Powinien podać nam swoje imię / wiek / wagę / wzrost, więc w Javie robimy to w następujący sposób
Teraz dodaliśmy zachowanie do naszej kategorii HumanBeing , więc możemy zapytać o jego imię, wiek, wzrost, wagę, ale od kogo zapytasz o te szczegóły, ponieważ
class HumanBeing
jest to tylko kategoria, jest to plan, na przykład architekt sporządza plan papier budynku, który chce zbudować, teraz nie możemy żyć dalej w planie ( jego opisie budynku ) możemy mieszkać w budynku tylko po jego zbudowaniu Więc tutaj musimy uczynić człowieka z naszej kategorii, którą opisane powyżej, więc jak to zrobimy w JavieTeraz w powyższym przykładzie stworzyliśmy naszego pierwszego człowieka o imieniu wiek wzrost waga, więc co dokładnie dzieje się w powyższym kodzie? . Tworzymy instancję kategorii HumanBeing, czyli powstaje obiekt naszej klasy
Przypadek 1: Obiekt i instancja wydają się być synonimami
Pozwólcie mi trochę rozwinąć, kiedy mówimy, że
HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);
obiekt naszej kategorii jest tworzony w pamięci sterty i jest do niego przydzielany jakiś adres ifirstHuman
zawiera odniesienie do tego adresu, teraz ten obiekt jest Przedmiot człowieczeństwa, a także instancja człowieczeństwa . Tutaj wydaje się, że obiekty i instancja są synonimami, powtórzę, że nie są synonimamiWznówmy naszą historię, stworzyliśmy naszego pierwszego Człowieka, teraz możemy zapytać o jego imię, wiek, wzrost, wagę, tak to robimy w Javie
więc mamy pierwszego człowieka i przesuńmy pióro, nadając naszemu pierwszemu człowiekowi jakąś kwalifikację, zróbmy go Doktorem, więc potrzebujemy kategorii o nazwie Doktor i dajmy naszemu Doktorowi pewne zachowanie, więc w Javie postępujemy w następujący sposób
Tutaj użyliśmy koncepcji dziedziczenia, która wprowadza w kodzie pewną możliwość ponownego wykorzystania, każdy lekarz zawsze będzie człowiekiem, będąc pierwszym, więc lekarz będzie miał Imię, wiek, wagę, wzrost, które zostaną odziedziczone po Człowieku, zamiast pisać je ponownie, zwróć uwagę, że właśnie napisaliśmy opis lekarza, którego jeszcze nie stworzyliśmy, więc stwórzmy Doktora w naszym
class Birth
Przypadek 2: Obiekt i instancja nie są synonimami
W powyższym kodzie możemy wyobrazić sobie, że tworzymy instancję naszej kategorii Doktor i ożywamy ją tj. Po prostu tworzymy obiekt kategorii Doktor , Jak już wiemy Obiekty są tworzone w pamięci sterty i
firstDoctor
zawiera odniesienie do tego obiektu na stercie;Ten konkretny obiekt
firstDoctor
jest następujący (należy pamiętać, żefirstDoctor
zawiera odniesienie do obiektu, nie jest to sam obiekt)firstDoctor
jest przedmiotemclass Doctor
i instancją Aclass Doctor
firstDoctor
to nie przedmiotclass HumanBeing
Ale instancjiclass HumanBeing
Zatem określony Object może być instancją określonej klasy, ale nie musi być obiektem tej danej klasy
Wniosek:
Przykład z prawdziwego świata będzie następujący: po raz pierwszy rodzimy się jako ludzie, więc wyobraź sobie nas jako obiekt człowieka, teraz, gdy dorastamy, podejmujemy obowiązki i uczymy się nowych umiejętności oraz odgrywamy różne role w życiu. Przykład Syn, brat, córka, ojciec Matko teraz Czym właściwie jesteśmy? Możemy powiedzieć, że jesteśmy obiektami człowieka, ale przykładami brata, córki, ... itd.
mam nadzieję, że to pomoże
Dziękuję Ci
źródło
Obiekty to rzeczy w pamięci, podczas gdy instancje to rzeczy, które się do nich odnoszą. Na powyższym zdjęciu:
źródło
Obiekt jest instancją klasy (dla języków opartych na klasach).
Myślę, że to najprostsze wyjaśnienie, jakie mogę wymyślić.
źródło
Klasa definiuje obiekt. W wielu językach można pójść jeszcze dalej i powiedzieć, że interfejs definiuje wspólne atrybuty i metody między obiektami.
Obiekt to coś, co może reprezentować coś w prawdziwym świecie. Jeśli chcesz, aby obiekt faktycznie reprezentował coś w prawdziwym świecie, musisz utworzyć instancję obiektu. Tworzenie instancji oznacza, że musisz zdefiniować cechy (atrybuty) tego konkretnego obiektu, zwykle za pomocą konstruktora.
Po zdefiniowaniu tych cech masz teraz instancję obiektu.
Mam nadzieję, że to wszystko wyjaśnia.
źródło
„Klasa opisuje zbiór obiektów zwanych jej instancjami”. - The Xerox learning Research Group, „The Smalltalk-80 System”, Byte Magazine Tom 06 Numer 08, str. 39, 1981.
źródło
Co to jest przedmiot?
Obiekt jest instancją klasy. Obiekt można najlepiej zrozumieć, znajdując przykłady z prawdziwego świata wokół siebie. Twoje biurko, laptop, Twój samochód są dobrymi przykładami przedmiotów w świecie rzeczywistym.
Rzeczywiste obiekty mają dwie cechy, wszystkie mają stan i zachowanie. Ludzie są również dobrym przykładem obiektu. My, ludzie, mamy stan / atrybuty - imię, wzrost, wagę i zachowanie - chodzić, biegać, rozmawiać, spać, kod: P.
Co to jest klasa?
Klasa to plan lub szablon opisujący szczegóły obiektu. Te szczegóły to mianowicie
nazwy atrybutów / operacji na stanach / metod
Rozważ powyższy przykład, pól
speed
igear
będzie reprezentować stan obiektu i metodychangeGear
,speedUp
iapplyBrakes
określają zachowanie obiektu Car ze światem zewnętrznym.Bibliografia:
źródło
Myślę, że ważne jest, aby podkreślić, że zasadniczo są dwie rzeczy. Plan i kopie. Ludzie mają tendencję do nazywania tych różnych rzeczy; klasy, obiekty, instancje to tylko niektóre z nazw, których używają dla nich ludzie. Ważne jest to, że istnieje plan i jego kopie - niezależnie od ich nazw. Jeśli już rozumiesz te dwie kwestie, po prostu unikaj innych rzeczy, które Cię mylą.
źródło
Porównajmy jabłka z jabłkami. Wszyscy wiemy, czym jest jabłko. Jak to wygląda. Jak to smakuje. To jest klasa. To jest definicja rzeczy. To jest to, co o czymś wiemy.
Teraz idź i znajdź jabłko. To jest przykład. Widzimy to. Możemy tego spróbować. Możemy z tym coś zrobić. To jest to, co mamy.
Klasa = co o czymś wiemy. Definicja.
Obiekt / Instancja = Coś, co pasuje do tej definicji, którą mamy i możemy z nią robić.
źródło
W niektórych przypadkach termin „obiekt” może być używany do opisu instancji, ale w innych jest używany do opisania odniesienia do instancji. Termin „instancja” odnosi się tylko do rzeczywistej instancji.
Na przykład Listę można opisać jako zbiór obiektów, ale w rzeczywistości zawiera odwołania do instancji obiektów.
źródło
Zawsze podobał mi się pomysł, który równa się definicji klasy jako „abstrakcyjnego typu danych” . To znaczy, kiedy definiujesz klasę, definiujesz nowy typ „czegoś”, jego reprezentację typu danych w kategoriach prymitywów i innych „rzeczy” oraz jego zachowanie w kategoriach funkcji i / lub metod. (Przepraszam za ogólnikowość i formalizm)
Za każdym razem, gdy definiujesz klasę, otwierasz nową możliwość definiowania pewnych obiektów wraz z ich właściwościami i zachowaniem, kiedy tworzysz instancję i / lub tworzysz z niej określony obiekt, faktycznie materializujesz tę możliwość.
Czasami terminy obiekt i instancje są wymienne. Niektórzy puryści OOP utrzymają, że wszystko jest obiektem, nie będę narzekać, ale w prawdziwym świecie OOP my, programiści, używamy dwóch koncepcji:
źródło
Programowanie obiektowe to metafora systemowa która pomaga organizować wiedzę, którą program musi obsługiwać, w sposób ułatwiający tworzenie programu. Decydując się na programowanie za pomocą OOP, odbierasz swoje OOP-Googles i decydujesz, że zobaczysz problem prawdziwego świata, gdy wiele obiektów współpracuje między sobą, wysyłając wiadomości. Zamiast widzieć faceta prowadzącego samochód, widzisz faceta wysyłającego wiadomość do samochodu, wskazującą, co ma zrobić samochód. Samochód jest dużym obiektem i odpowie na tę wiadomość, wysyłając wiadomość do swojego silnika lub koła, aby móc poprawnie zareagować na to, co Kierowca nakazał mu w komunikacie itp.
Po utworzeniu metafory systemu i postrzeganiu całej rzeczywistości jako obiektów wysyłających wiadomości, decydujesz się umieścić wszystkie rzeczy, które widzisz, a które są istotne dla domeny problemowej, w komputerze. Zauważysz tam, że jest wielu Facetów kierujących różnymi kartami i bezsensowne jest programowanie zachowania każdego z nich osobno, ponieważ wszyscy zachowują się w ten sam sposób ... Więc możesz powiedzieć dwie rzeczy:
Następnie zaczynasz wprowadzać do komputera informacje o tym, jak zachowują się wszystkie Sterowniki (lub jak zachowuje się pierwszy sterownik oraz jak drugi i trzeci różnią się od tego), a po chwili masz swój program i używasz kodu do utwórz trzy sterowniki, które są modelem, którego używasz na tym komputerze, aby odnieść się do sterowników, które widziałeś w prawdziwym świecie. Te 3 sterowniki, które utworzyłeś w komputerze, to instancje prototypu (w rzeczywistości pierwszy z nich to prototyp, pierwszy może być sam prototypem, w zależności od tego, jak modelujesz) lub klasę, którą utworzyłeś. Różnica między instancją a obiektem polega na tym, że obiekt jest metaforą, której używasz w prawdziwym świecie. Wybierasz postrzeganie faceta i samochodu jako obiektów (błędem byłoby powiedzieć, że postrzegasz je jako instancje) współpracujących między sobą. A potem używasz go jako inspiracji do tworzenia kodu. Instancja istnieje w twoim programie dopiero po utworzeniu prototypu lub klasy. „Obiekty” istnieją poza komputerem, ponieważ jest to mapowanie, którego używasz do połączenia świata rzeczywistego z programem. Łączy faceta z instancją sterownika utworzoną na komputerze. Tak więc obiekt i instancja są niezwykle powiązane, ale nie są dokładnie takie same (instancja jest „odnogą” obiektu w programie, a druga „noga” znajduje się w świecie rzeczywistym).
źródło
Myślę, że najlepsza odpowiedź została już rozdana.
Klasy są planami, a obiekty to budynki lub przykłady tego planu również mi się przydały.
Czasami chciałbym pomyśleć, że klasy są szablonami (jak w MS Word), podczas gdy obiekty to dokumenty, które używają szablonu.
źródło
Rozszerzając jeden z wcześniej podanych przykładów w tym wątku ...
Rozważ scenariusz - istnieje wymóg, aby w sąsiedztwie wybudować 5 domów na cele mieszkalne. Wszystkie 5 domów ma wspólną architekturę konstrukcyjną. Architektura konstrukcji to klasa . Dom jest obiektem . Każdy dom, w którym przebywają ludzie, jest przykładem .
źródło