A diferença entre classes, objetos e instâncias

93

O que é uma classe, um objeto e uma instância em Java?

Pranjut
fonte
Verifique o seguinte link
Pushkarraj Pujari

Respostas:

89

Java (e qualquer outra linguagem de programação) é modelado em termos de tipos e valores . No nível teórico, um valor é uma representação de algum quantum de informação e um tipo é um conjunto de valores. Quando dizemos que o valor X é uma instância do tipo Y, estamos simplesmente dizendo que X é um membro do conjunto de valores do tipo Y.

Então é isso que o termo "instância" realmente significa: ele descreve um relacionamento, não uma coisa.

O sistema de tipos da linguagem de programação Java suporta dois tipos de tipos, tipos primitivos e tipos de referência . Os tipos de referência são divididos em classes e tipos de array . Um objeto Java é uma instância de um tipo de referência.

Um objeto é uma instância de classe ou um array. ( JLS 4.3.1 )

Essa é a visão teórica do tipo.

Na prática, a maioria dos desenvolvedores Java trata as palavras "instância" e "objeto" como sinônimos. (E isso inclui a mim, então estou tentando explicar algo rapidamente.) E a maioria dos desenvolvedores usa a palavra "valor" em vez de "instância" para se referir a uma instância de um tipo primitivo.

Stephen C
fonte
3
Agradeço muito sua resposta, senhor, e quase consegui, só mais uma pergunta. Dizemos- "Sempre que o compilador atinge o construtor de argumento 0, ele cria uma instância de uma classe.". Nesse contexto, o que realmente é criado uma instância ou um objeto? Um objeto, eu acho, e usamos a palavra "instância" como sinônimo. Mas seria bom, se você confirmar.
Pranjut
3
@Ryan: Basicamente sim: é a criação de um objeto que é uma instância da classe em questão. (Mas observe que a frase citada está dizendo "instância de uma classe" em vez de apenas "instância" ... então o autor não está realmente usando "instância" como sinônimo aqui.)
Stephen C
1
@RuneFS - a "modelagem" da qual estou falando não é sobre representação. É teórico. Sim, em algumas linguagens existem objetos que denotam tipos, ou mesmo que permitem enumerar todas as instâncias de um tipo. Mas essas propriedades aumentam a "modelagem" genérica em vez de invalidá-la.
Stephen C
1
@RuneFS - Não ... estou falando sobre "teoria dos tipos". É um ramo da matemática. É independente da tecnologia usada para executar programas. O cálculo mais próximo que a teoria de tipos chega da computação é o cálculo lambda. (Se você estiver interessado, tente obter uma cópia de "Tipos e linguagens de programação", de Benjamin C. Pierce.)
Stephen C
1
Você está cometendo o mesmo erro que user2390183. Você está tratando variáveis ​​como "nomes". Eles não são. Variáveis ​​são "portadores de referência" que contêm referências a objetos. Os objetos não têm nomes intrínsecos. As referências são o que há de mais próximo de um "nome" para um objeto, exceto que não têm uma representação constante. (O GC pode mover um objeto que muda o padrão de bits usado para representar a referência.)
Stephen C
99

Uma classe é um projeto que você usa para criar objetos . Um objeto é uma instância de uma classe - é uma 'coisa' concreta que você fez usando uma classe específica. Portanto, 'objeto' e 'instância' são a mesma coisa, mas a palavra 'instância' indica a relação de um objeto com sua classe.

Isso é fácil de entender se você olhar um exemplo. Por exemplo, suponha que você tenha uma aula House. Sua própria casa é um objeto e uma instância de classe House. A casa de sua irmã é outro objeto (outra instância de classe 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();

A aula Housedescreve o conceito do que é uma casa, e há casas específicas de concreto que são objetos e instâncias de classeHouse .

Nota: Isso é exatamente igual em Java e em todas as linguagens de programação orientadas a objetos.

Jesper
fonte
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 e myCar são objetos myHouse é uma instância de House (relaciona Object-myHouse a sua Class-House) myCar é uma instância de Car. Isso é verdade, por favor, veja a resposta acima pelo usuário 2390183 está correto ou não?
Suraj Jain
30

Uma classe é basicamente uma definição e contém o código do objeto. Um objeto é uma instância de uma classe

por exemplo se você diz

String word = new String();

a classe é a classe String, que descreve a palavra do objeto (instância).

Quando uma classe é declarada, nenhuma memória é alocada, então a classe é apenas um modelo.

Quando o objeto da classe é declarado, a memória é alocada.

mustafabar
fonte
Você quis dizer que objetos e instâncias são iguais?
Pranjut
Obrigado David pelo link. Dos tópicos que obtive, todas as coisas do mundo real que têm estado e comportamento podem ser chamadas de "objetos". E para classificar esses objetos, usamos class (uma classe é o projeto a partir do qual os objetos individuais são criados). E diz que, os objetos da classe são instâncias. Agora, por favor, alguém me diga quais são as diferenças entre objeto e instância? Isso significa que o objeto não existe realmente no contexto da programação e instância representa o objeto nele?
Pranjut
@Mustafa: Lamento contradizê-lo, mas de acordo com o JLS, um array também é um objeto em Java. E você descobrirá que o JLS não define o termo 'instância' de forma alguma. Veja minha resposta.
Stephen C
@Ryan: Veja minha resposta para a distinção entre "instância" e "objeto". A resposta e o comentário de @Mustafa são (IMO) enganosos.
Stephen C
@mustafabar - "Quando uma classe é declarada, nenhuma memória é alocada, então a classe é apenas um modelo." - E isso também não é verdade. A memória é alocada para (pelo menos) representar as staticvariáveis ​​da classe. (E também para outras coisas que estão relacionadas à identidade de tipo da classe.)
Stephen C
13

Eu gosto da explicação de Jesper em termos leigos

Ao improvisar exemplos da resposta de Jesper,

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 e myCar são objetos

myHouse é uma instância de House (relaciona Object-myHouse a sua Class-House) myCar é uma instância de Car

em resumo

"myHouse é uma instância de Class House" que é o mesmo que dizer "myHouse é um objeto do tipo House"

user2390183
fonte
6

Classe é o tipo de dados, você usa esse tipo para criar o objeto.

  • A instância é lógica, mas o objeto é físico. Os meios ocupam alguma memória.

  • Podemos criar uma instância para a classe abstrata e também para a interface, mas não podemos criar um
    objeto para elas.

  • Objeto é instância de classe e instância significa representante de classe, ou seja, objeto.

  • Instância refere-se à referência de um objeto.

  • O objeto está na verdade apontando para o endereço de memória dessa instância.

  • Você não pode passar instância sobre as camadas, mas você pode passar o objeto sobre as camadas

  • Você não pode armazenar uma instância, mas pode armazenar um objeto

  • Um único objeto pode ter mais de uma instância.

  • A instância terá a definição da classe e a definição do objeto, enquanto no objeto terá apenas a definição do objeto.

Sintaxe do objeto:

 Classname var=new Classname();

Mas, por exemplo, a criação retorna apenas um ponteiro se referindo a um objeto, a sintaxe é:

 Classname varname;
SwatiKothari
fonte
3

Em java, os objetos são gerados na memória heap. Estes requerem referência para serem apontados e usados ​​em nosso aplicativo. A referência tem a localização da memória do objeto com a qual podemos usar os objetos em nosso aplicativo. Em resumo, uma referência nada mais é do que o nome da variável que armazena o endereço do objeto instanciado em um local da memória.

Um instanceé um termo geral para object. FYI, Objecté uma classe.

Por exemplo,

Class A{

}

A ref = new A();

Para o trecho de código acima, ref é a referência para um objeto da classe A gerado no heap.

Uma corrida
fonte
3

Honestamente, me sinto mais confortável com as definições de blog do Alfred :

Objeto : os objetos do mundo real compartilham 2 características principais, estado e comportamento. Os humanos têm estado (nome, idade) e comportamento (correr, dormir). O carro tem estado (velocidade atual, marcha atual) e comportamento (aplicação do freio, mudança de marcha). Os objetos de software são conceitualmente semelhantes aos objetos do mundo real: eles também consistem em estado e comportamento relacionado. Um objeto armazena seu estado em campos e expõe seu comportamento por meio de métodos.

Classe : é um “template” / “blueprint” que é usado para criar objetos. Basicamente, uma classe consiste em campo, campo estático, método, método estático e construtor. O campo é usado para manter o estado da classe (por exemplo: nome do objeto Aluno). Método é usado para representar o comportamento da classe (por exemplo: como um objeto Aluno vai se levantar). Construtor é usado para criar uma nova instância da classe.

Instância : uma instância é uma cópia única de uma classe que representa um objeto. Quando uma nova instância de uma classe é criada, a JVM alocará um espaço de memória para essa instância de classe.

Dado o próximo exemplo:

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);
    }
}

Para o caso 1, existem duas instâncias da classe Person, mas ambas as instâncias representam o mesmo objeto.

Para o caso 2, existem duas instâncias da classe Person, mas cada instância representa um objeto diferente.

Portanto, classe, objeto e instância são coisas diferentes. Objeto e instância não são sinônimos, conforme sugerido na resposta selecionada como resposta certa.

Carlos Casallas
fonte
2

Se você tem um programa que modela carros, tem uma classe para representar carros, então em Code você poderia dizer:

Car someCar = new Car();

someCar agora é uma instância da classe Car. Se o programa for usado em uma oficina e o someCar representar seu carro em seu sistema, então seu carro é o objeto.

Portanto, Car é uma classe que pode representar qualquer carro do mundo real someCar é uma instância da classe Car e someCare representa um objeto da vida real (seu carro)

no entanto, instância e objeto são frequentemente usados ​​de forma intercambiável quando se trata de discutir a codificação

Rune FS
fonte
1
Estritamente falando, someCaré uma referência a uma instância de carro. A própria instância não tem nome.
Joachim Sauer
2

Qualquer tipo de dado que seu computador armazena e processa é, em sua representação mais básica, uma fileira de bits. A forma como esses bits são interpretados é feita por meio de tipos de dados. Os tipos de dados podem ser primitivos ou complexos. Os tipos de dados primitivos são - por exemplo - int ou double. Eles têm um comprimento específico e uma forma específica de serem interpretados. No caso de um inteiro, normalmente o primeiro bit é usado para o sinal, os outros são usados ​​para o valor.

Os tipos de dados complexos podem ser combinações de tipos de dados primitivos e outros complexos e são chamados de "Classe" em Java.

Você pode definir o tipo de dados complexo PeopleName que consiste em duas Strings chamadas de nome e sobrenome. Cada String em Java é outro tipo de dados complexo. Strings em retorno são (provavelmente) implementadas usando o tipo de dados primitivo char para o qual Java sabe quantos bits eles levam para armazenar e como interpretá-los.

Ao criar uma instância de um tipo de dados, você obtém um objeto e seus computadores reservam alguma memória para ele e lembram sua localização e o nome dessa instância. Uma instância de PeopleName na memória ocupará o espaço das duas variáveis ​​String e um pouco mais para contabilidade. Um inteiro ocupa 32 bits em Java.

Os tipos de dados complexos podem ter métodos atribuídos a eles. Os métodos podem executar ações em seus argumentos ou na instância do tipo de dados a partir do qual você chama este método. Se você tiver duas instâncias de PeopleName chamadas p1 e p2 e chamar um método p1.getFirstName (), ele geralmente retorna o primeiro nome da primeira pessoa, mas não o da segunda pessoa.

Kage
fonte
2

O conceito por trás de classes e objetos é encapsular a lógica em uma única unidade de programação. As classes são os projetos dos objetos criados.

Aqui está um exemplo de uma classe que representa um carro:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

Você pode criar instâncias do objeto Car assim:

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

Eu peguei o exemplo deste tutorial

filip_j
fonte
2

Classe : Estrutura

Objeto : Manifestação Física

Instância : cada objeto criado a partir da classe

Referência : Endereço do Objeto

Abishek M
fonte
1

Classe

  • Ele tem existência lógica, ou seja, nenhum espaço de memória é alocado quando é criado.

  • É um conjunto de objetos.

  • Uma classe pode ser considerada um projeto para criar objetos.

    • É criado usando a palavra-chave class

    • Uma classe define os métodos e membros de dados que serão possuídos por Objetos.


Objeto

  • Ele tem existência física, ou seja, o espaço de memória é alocado quando é criado.

  • É uma instância de uma classe.

  • Um objeto é uma entidade única que contém membros de dados e funções de membro juntos na linguagem OOP.

    • É criado usando uma nova palavra-chave

    • Um objeto especifica as implementações dos métodos e os valores que serão possuídos pelos membros de dados na classe.


fonte
1
O espaço pode ser alocado quando uma classe é "criada". O espaço é necessário para quaisquer variáveis ​​estáticas definidas pela classe. (E "lógico" versus "físico" é esticar isso, uma vez que uma representação de objeto é apenas uma ajuda de padrões de bits em algum dispositivo de memória.)
Stephen C
@StephenC qual poderia ser a outra diferença então?
Veja minha resposta. Esta pergunta não pode ser respondida adequadamente apenas falando sobre diferenças.
Stephen C
0

Uma classe é um projeto necessário para fazer um objeto (= instância).

A diferença entre um objeto e uma instância é que um objeto é uma coisa e uma instância é uma relação.

Em outras palavras, instância descreve a relação de um objeto com a classe da qual o objeto foi feito.

Yoji Yamamoto
fonte
-1

A definição "Objeto é uma instância de uma classe", é conceitualmente errada, mas correta conforme a implementação. Na verdade, os recursos orientados a objetos são retirados da vida real, para focar a mente do programador de mais para menos. Na vida real, as aulas são projetadas para gerenciar o objeto. Por exemplo, nós, seres humanos, temos uma casta, religião, nacionalidade e muito mais. Essas castas, religião, nacionalidade são as classes e não existem sem seres humanos. Mas na implementação não há existência de objetos sem classes. Objeto- O objeto é uma entidade discreta com algum atributo bem definido. Aqui, discreto significa algo que o torna único. Atributos bem definidos fazem sentido em algum contexto. Class- Classificação de objeto com algum comportamento comum ou objetos de algum tipo comum.

Gaurav Kathuria
fonte
-1

Embora as respostas acima estejam corretas, outra maneira de pensar sobre Classes e Objetos seria usar exemplos do mundo real: Uma classe chamada Animal pode conter objetos como Gato, Cachorro ou Peixe. Um objeto com um título de Bíblia seria da classe Livro, etc. As classes são gerais, os objetos são específicos. Este exemplo de pensamento me ajudou quando eu estava aprendendo Java.

kurdtpage
fonte
Sim ... mas as analogias também podem ser confusas. Se Animalé uma classe e Caté uma instância, o que é meu gatinho "Fluffy"?
Stephen C
Na verdade, no mundo real (e na teoria dos tipos), Animaldenota o conjunto de todos os animais e Catdenota o conjunto de todos os gatos. Caté um subconjunto de Animalnão uma instância de Animal.
Stephen C
-2

A classe é um modelo ou tipo. Um objeto é uma instância da classe.

Por exemplo:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet é uma classe e newTweet é um objeto da classe.

Gagan
fonte
Estas são apenas palavras. Você realmente não explica o que as palavras significam. (E, de fato, as classes Java NÃO se comportam como modelos, seja na vida real ou da maneira que o fazem em linguagens como Javascript, Python, Ruby, etc.)
Stephen C