Sınıflar, Nesneler ve Örnekler arasındaki fark


Yanıtlar:


89

Java (ve diğer herhangi bir programlama dili) türler ve değerler açısından modellenmiştir . Teorik düzeyde, bir değer , bazı kuantum bilginin bir temsilidir ve bir tür , bir değerler kümesidir. X değerinin Y türünün bir örneği olduğunu söylediğimizde, yalnızca X'in Y türü olan değerler kümesinin bir üyesi olduğunu söylüyoruz.

Yani "örnek" terimi gerçekten şu anlama geliyor: bir ilişkiyi tanımlıyor, bir şey değil.

Java programlama dilinin tür sistemi iki tür türü destekler: ilkel türleri ve başvuru türleri . Başvuru türleri ayrıca sınıflara ve dizi türlerine ayrılır . Java nesnesi , referans türünün bir örneğidir.

Bir nesne, bir sınıf örneği veya bir dizidir. ( JLS 4.3.1 )

Bu tür teorik görüştür.

Uygulamada, çoğu Java geliştiricisi "eşgörünüm" ve "nesne" sözcüklerini eşanlamlı olarak ele alır. (Ve buna ben de dahil, o zaman bir şeyi hızlı bir şekilde açıklamaya çalışıyorum.) Ve çoğu geliştirici, ilkel bir türün örneğine atıfta bulunmak için "örnek" yerine "değer" kelimesini kullanır.


3
Cevabınız için gerçekten minnettarım efendim ve neredeyse anladım, sadece bir soru daha. Derleyici, 0 argüman yapıcısına her vurduğunda, bir sınıfın örneğini oluşturur. "Deriz. Bu bağlamda, gerçekten bir örnek veya bir nesne yaratılan nedir? Sanırım bir nesne ve biz "örnek" kelimesini eşanlamlı olarak kullanıyoruz. Ama daha iyi onaylarsanız, nazik olurdu.
Pranjut

3
@Ryan: Temelde evet: söz konusu Sınıfın bir örneği olan bir Nesne yaratmaktır. (Ancak alıntılanan cümlenin sadece "örnek" yerine "bir Sınıf örneği" dediğine dikkat edin ... bu nedenle yazar burada "örnek" i eşanlamlı olarak kullanmıyor.)
Stephen C

1
@RuneFS - bahsettiğim "modelleme" temsil ile ilgili değil. Teoriktir. Evet, bazı dillerde türleri belirten, hatta bir türün tüm örneklerini numaralandırmanıza izin veren nesneler vardır. Ancak bu özellikler, onu geçersiz kılmak yerine genel "modellemeyi" güçlendirir.
Stephen C

1
@RuneFS - Hayır ... "tip teorisinden" bahsediyorum. Matematiğin bir dalıdır. Programları çalıştırmak için kullanılan teknolojiden bağımsızdır. Hesaplamaya en yakın tip teorisi lambda hesabıdır. (İlgileniyorsanız, Benjamin C. Pierce tarafından yazılan "Türler ve Programlama Dilleri" nin bir kopyasını edinin ve alın.)
Stephen C

1
Aynı hatayı yapıyorsun user2390183. Değişkenlere "isim" muamelesi yapıyorsunuz. Onlar değil. Değişkenler, nesnelere referanslar içeren "referans tutuculardır". Nesnelerin iç isimleri yoktur. Referanslar, sabit bir temsile sahip olmadıkları dışında, bir nesnenin "ismine" en yakın şeydir. (GC, referansı temsil etmek için kullanılan bit desenini değiştiren bir nesneyi hareket ettirebilir.)
Stephen C

99

Bir sınıf oluşturmak için kullanabilirsiniz bir plan olduğunu nesneler . Bir nesne, bir sınıfın örneğidir - belirli bir sınıfı kullanarak yaptığınız somut bir "şey" dir. Dolayısıyla, 'nesne' ve 'örnek' aynı şeydir, ancak 'örnek' kelimesi bir nesnenin sınıfıyla ilişkisini belirtir.

Bir örneğe bakarsanız bunu anlamak kolaydır. Örneğin, bir sınıfınız olduğunu varsayalım House. Kendi eviniz bir nesnedir ve bir sınıf örneğidir House. Kız kardeşinizin evi başka bir nesnedir (başka bir sınıf örneği House).

// Class House describes what a house is
class House {
    // ...
}

// You can use class House to create objects (instances of class House)
House myHouse = new House();
House sistersHouse = new House();

Sınıf House, bir evin ne olduğu kavramını tanımlar ve sınıfın nesneleri ve örnekleri olan belirli, somut evler vardır House.

Not: Bu, tüm nesne yönelimli programlama dillerinde olduğu gibi Java'da da tamamen aynıdır.


class House { // blue print for House Objects } class Car { // blue print for Instances of Class Car } House myHouse = House new(); Car myCar = Car new();
Suraj Jain

myHouse ve myCar nesnelerdir myHouse bir House örneğidir (Object-myHouse'u Class-House ile ilişkilendirir) myCar, Car'ın bir örneğidir. Bu doğru mu, lütfen yukarıdaki user2390183 yanıtına bakın doğru mu değil mi?
Suraj Jain

30

Bir sınıf temelde bir tanımdır ve nesnenin kodunu içerir. Bir nesne, bir sınıfın bir örneğidir

örneğin diyorsan

String word = new String();

sınıf, nesne (örnek) kelimesini tanımlayan String sınıfıdır.

Bir sınıf bildirildiğinde, bellek ayrılmaz, dolayısıyla sınıf sadece bir şablondur.

Sınıfın nesnesi bildirildiğinde, bellek ayrılır.


Nesnelerin ve örneklerin aynı olduğunu mu söylediniz?
Pranjut 01

Bağlantı için teşekkürler David. Bunu aldığım konulardan Hali ve davranışı olan gerçek dünyadaki her şey "nesne" olarak adlandırılabilir. Ve bu nesneleri sınıflandırmak için sınıf kullanıyoruz (Bir sınıf, tek tek nesnelerin oluşturulduğu plandır). Ve sınıfın nesnelerinin örnekler olduğunu söylüyor. Şimdi lütfen birisi bana nesne ve örnek arasındaki farkların ne olduğunu söylesin Bu, nesnenin programlama bağlamında gerçekten var olmadığı ve örnek, içindeki nesneyi temsil ettiği anlamına mı geliyor?
Pranjut

@Mustafa: Sizinle çeliştiğim için üzgünüm ama JLS'ye göre Java'da dizi de bir nesnedir. Ve JLS'nin 'örnek' terimini hiç tanımlamadığını göreceksiniz. Cevabımı gör.
Stephen C

@Ryan: "Örnek" ve "nesne" arasındaki fark için cevabıma bakın. @ Mustafa'nın cevabı ve yorumu (IMO) yanıltıcı.
Stephen C

@mustafabar - "Bir sınıf bildirildiğinde, bellek ayrılmadığı için sınıf sadece bir şablondur." - Ve bu da doğru değil. Bellek ayrılmıştır (en azından) staticsınıfın değişkenlerini temsil eder . (Ve sınıfın tip kimliğiyle ilgili diğer şeyler için de.)
Stephen C

13

Jesper'ın meslekten olmayan terimlerle açıklamasını seviyorum

Jesper'ın cevabından doğaçlama örnekler vererek,

class House {
// blue print for House Objects
}

class Car {
// blue print for Instances of Class Car 
}

House myHouse = new House();
Car myCar = new Car();

myHouse ve myCar nesnelerdir

myHouse bir House örneğidir (Object-myHouse'u Class-House ile ilişkilendirir) myCar bir Car örneğidir

Kısacası

"myHouse bir olan örnek bir sınıfı söyleyerek aynıdır Ev" "myHouse bir olan nesne arasında tip Ev"


6

Sınıf Veri Türüdür, Nesne oluşturmak için bu türü kullanırsınız.

  • Örnek Mantıksaldır, ancak nesne Fizikseldir, araç biraz bellek kaplar.

  • Soyut sınıf için olduğu kadar arayüz için de bir örnek oluşturabiliriz, ancak bunlar için bir
    nesne yaratamayız .

  • Nesne, sınıfın örneğidir ve örnek, sınıfın yani nesnenin temsilcisi anlamına gelir.

  • Örnek, bir nesnenin Referansını ifade eder.

  • Nesne aslında o örneğin bellek adresine işaret ediyor.

  • Örneği katmanların üzerinden geçiremezsiniz ancak nesneyi katmanların üzerinden geçirebilirsiniz.

  • Bir örneği depolayamazsınız ancak bir nesneyi depolayabilirsiniz

  • Tek bir nesnenin birden fazla örneği olabilir.

  • Örnek, hem sınıf tanımına hem de nesne tanımına sahip olacaktır, burada nesnede olduğu gibi yalnızca nesne tanımına sahip olacaktır.

Nesne Sözdizimi:

 Classname var=new Classname();

Ancak, örneğin oluşturma, yalnızca bir nesneye başvuran bir işaretçi döndürür, sözdizimi şöyledir:

 Classname varname;

3

Java'da, nesneler yığın hafızasında ortaya çıkar. Bunlar, başvurumuzda belirtilmesi ve kullanılması için referans gerektirir. Referans, uygulamamızdaki nesneleri kullanabileceğimiz nesnenin bellek konumuna sahiptir. Kısaca bir referans, bir bellek konumunda somutlaştırılmış nesnenin adresini depolayan değişkenin adından başka bir şey değildir.

An instance, için genel bir terimdir object. FYI, Objectbir sınıftır.

Örneğin,

Class A{

}

A ref = new A();

Yukarıdaki kod parçacığı için ref, öbek üzerinde oluşturulan A sınıfı bir nesnenin referansıdır.


3

Açıkçası, Alfred blog tanımlarında kendimi daha rahat hissediyorum :

Nesne : gerçek dünya nesneleri 2 ana özelliği, durumu ve davranışı paylaşır. İnsanın durumu (adı, yaşı) ve davranışı (koşma, uyuma) vardır. Otomobilin durumu (mevcut hız, mevcut vites) ve davranışı (fren uygulama, vites değiştirme) var. Yazılım nesneleri kavramsal olarak gerçek dünya nesnelerine benzer: onlar da durumdan ve ilgili davranışlardan oluşur. Bir nesne, durumunu alanlarda depolar ve davranışını yöntemler aracılığıyla ortaya çıkarır.

Sınıf : nesneler oluşturmak için kullanılan bir "şablon" / "taslak" tır. Temel olarak, bir sınıf alan, statik alan, yöntem, statik yöntem ve kurucudan oluşacaktır. Alan, sınıfın durumunu tutmak için kullanılır (örneğin: Öğrenci nesnesinin adı). Yöntem, sınıfın davranışını temsil etmek için kullanılır (örneğin: bir Öğrenci nesnesinin nasıl ayağa kalkacağı). Oluşturucu, Sınıfın yeni bir Eşgörünümünü oluşturmak için kullanılır.

Örnek : Örnek, bir Nesneyi temsil eden bir Sınıfın benzersiz bir kopyasıdır. Bir sınıfın yeni bir örneği oluşturulduğunda, JVM bu sınıf örneği için bir bellek odası ayıracaktır.

Bir sonraki örnek göz önüne alındığında:

public class Person {
    private int id;
    private String name;
    private int age;

    public Person (int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (id != other.id)
            return false;
        return true;
    }

    public static void main(String[] args) {
        //case 1
        Person p1 = new Person(1, "Carlos", 20);
        Person p2 = new Person(1, "Carlos", 20);

        //case 2
        Person p3 = new Person(2, "John", 15);
        Person p4 = new Person(3, "Mary", 17);
    }
}

Durum 1 için, Person sınıfının iki örneği vardır, ancak her iki örnek de aynı nesneyi temsil eder.

Durum 2 için, Person sınıfının iki örneği vardır, ancak her örnek farklı bir nesneyi temsil eder.

Yani sınıf, nesne ve örnek farklı şeylerdir. Doğru cevap olarak seçilen cevapta önerildiği gibi nesne ve örnek eşanlamlı değildir.


2

Arabaları modelleyen bir programınız varsa, arabaları temsil edecek bir sınıfınız vardır, bu nedenle Kod'da şunu söyleyebilirsiniz:

Car someCar = new Car();

someCar artık Car sınıfının bir örneğidir. Program bir tamirhanede kullanılıyorsa ve someCar arabanızı kendi sisteminde temsil ediyorsa, o zaman nesneniz arabanızdır.

Yani Araba, herhangi bir gerçek dünya otomobilini temsil edebilen bir sınıftır someCar, Araba sınıfının bir örneğidir ve someCare, tek bir gerçek yaşam nesnesini (arabanız) temsil eder .

ancak örnek ve nesne, kodlama tartışılırken sıklıkla birbirinin yerine kullanılır


1
Kesin olarak söylemek gerekirse someCar, bir Car örneğine referanstır. Örneğin kendisinin bir adı yoktur.
Joachim Sauer

2

Bilgisayarınızın depoladığı ve işlediği her türlü veri, en temel temsilinde bir bit dizisidir. Bu bitlerin yorumlanma şekli, veri türleri aracılığıyla yapılır. Veri türleri ilkel veya karmaşık olabilir. İlkel veri türleri - örneğin - int veya double'dır. Belirli bir uzunlukları ve belirli bir yorumlanma tarzları vardır. Bir tamsayı durumunda, genellikle ilk bit işaret için kullanılırken diğerleri değer için kullanılır.

Karmaşık veri türleri, ilkel ve diğer karmaşık veri türlerinin kombinasyonları olabilir ve Java'da "Sınıf" olarak adlandırılır.

Ad ve soyad olarak adlandırılan iki Dizeden oluşan karmaşık veri türü KişilerAdı tanımlayabilirsiniz. Java'daki her String, başka bir karmaşık veri türüdür. Buna karşılık dizeler (muhtemelen), Java'nın depolamak için kaç biti depoladığını ve bunları nasıl yorumlayacağını bildiği ilkel veri türü char kullanılarak gerçeklenir.

Bir veri türünün bir örneğini oluşturduğunuzda, bir nesne alırsınız ve bilgisayarlarınız bunun için bir miktar bellek ayırır ve konumunu ve o örneğin adını hatırlar. Bellekteki bir PeopleName örneği, iki String değişkeninin alanını ve ayrıca defter tutma için biraz daha fazla yer kaplar. Java'da bir tamsayı 32 bit kaplar.

Karmaşık veri türlerinin kendilerine atanmış yöntemleri olabilir. Yöntemler, bağımsız değişkenleri üzerinde veya bu yöntemi çağırdığınız veri türü örneğinde eylemler gerçekleştirebilir. P1 ve p2 adında iki PeopleName örneğiniz varsa ve p1.getFirstName () yöntemini çağırırsanız, genellikle ilk kişinin adını döndürür, ancak ikinci kişinin adını döndürmez.


2

Sınıfların ve nesnelerin arkasındaki kavram, mantığı tek bir programlama biriminde kapsüllemektir. Sınıflar , nesnelerin oluşturulduğu taslaklardır.

İşte bir Arabayı temsil eden bir sınıf örneği:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

Sen oluşturabilir örnekleri arasında nesnesi böyle Car:

Car audi = new Car();
Car toyota = new Car();

Bu öğreticiden örnek aldım


2

Sınıf : Yapı

Nesne : Fiziksel Tezahür

Örnek : sınıftan oluşturulan her nesne

Referans : Nesnenin Adresi


1

Sınıf

  • Mantıksal bir varlığa sahiptir, yani yaratıldığında bellek alanı ayrılmamıştır.

  • Bir dizi nesnedir.

  • Bir sınıf, nesneler yaratmanın bir planı olarak kabul edilebilir.

    • Class anahtar sözcüğü kullanılarak oluşturulur

    • Bir sınıf, Nesnelerin sahip olacağı yöntemleri ve veri üyelerini tanımlar.


Nesne

  • Fiziksel varlığı vardır, yani bellek alanı yaratıldığında tahsis edilir.

  • Bir sınıfın örneğidir.

  • Bir nesne, veri üyelerini ve üye işlevlerini OOP dilinde birlikte içeren benzersiz bir varlıktır.

    • Yeni anahtar kelime kullanılarak oluşturulur

    • Bir nesne, yöntemlerin uygulamalarını ve sınıftaki veri üyelerinin sahip olacağı değerleri belirtir.


1
Bir sınıf "oluşturulduğunda" alan tahsis edilebilir. Alan, sınıf tarafından tanımlanan tüm statik değişkenler için gereklidir. (Ve "mantıksal" ile "fiziksel", onu genişletiyor, çünkü bir nesne temsili, bazı bellek aygıtlarında yalnızca bit desenleri yardımcı oluyor.)
Stephen C

@StephenC o zaman diğer fark ne olabilir?

Cevabımı gör. Bu soru sadece farklılıklardan bahsedilerek doğru bir şekilde cevaplanamaz.
Stephen C

0

Sınıf, bir nesne (= örnek) yapmak için gerekli olan bir plandır.

Bir nesne ile bir örnek arasındaki fark, bir nesnenin bir şey ve bir örneğin bir ilişkidir.

Başka bir deyişle, örnek, bir nesnenin, nesnenin yapıldığı sınıfla ilişkisini tanımlar.


-1

"Nesne bir sınıfın örneğidir" tanımı kavramsal olarak yanlıştır, ancak uygulamaya göre doğrudur. Aslında nesneye yönelik özellikler, programcının zihnini çoktan aza odaklamak için gerçek hayattan alınmıştır. Gerçek hayatta sınıflar nesneyi yönetmek için tasarlanmıştır.Örneğin, biz insanların bir kastı, dini, milliyeti ve çok daha fazlası var. Bu dökümler, din, milliyet sınıflardır ve insan olmadan varolmazlar. Ancak uygulamada sınıfsız nesnelerin varlığı yoktur. Object- Object, iyi tanımlanmış bir niteliğe sahip ayrı bir varlıktır. Burada ayrık, onu diğerinden benzersiz kılan bir anlama gelir. İyi tanımlanmış nitelik bazı bağlamlarda anlamlıdır. Sınıf - Bazı ortak davranışlara veya bazı ortak tipteki nesnelere sahip nesnenin sınıflandırılması.


-1

Yukarıdaki cevaplar doğru olsa da, Sınıflar ve Nesneler hakkında düşünmenin başka bir yolu da gerçek dünyadan örnekler kullanmak olabilir: Hayvan adlı bir sınıf, Kedi, Köpek veya Balık gibi nesneleri içerebilir. İncil başlıklı bir nesne, sınıf Kitap vb. Olabilir. Sınıflar geneldir, nesneler özeldir. Bu düşünce örneği Java öğrenirken bana yardımcı oldu.


Evet ... ama analojiler de kafa karıştırıcı olabilir. Eğer Animalbir sınıftır ve Catbir örneğidir, benim evcil kedi kedi "Kabarık" nedir?
Stephen C

Aslında, gerçek dünyada (ve tip teorisinde), Animaltüm hayvanların Catkümesini ve tüm kedilerin kümesini belirtir. Cat, Animalörneği olmayan bir alt kümedir Animal.
Stephen C

-2

Sınıf bir şablon veya türdür. Nesne, sınıfın bir örneğidir.

Örneğin:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet bir sınıftır ve newTweet, sınıfın bir nesnesidir.


Bunlar sadece kelimeler. Kelimelerin ne anlama geldiğini aslında açıklamıyorsun. (Ve aslında, Java sınıfları gerçek hayatta ya da Javascript, Python, Ruby vb.
Stephen C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.