Diferença entre classe e tipo

105

Sendo novo em Java, estou confuso entre os conceitos de classe e tipo . Por exemplo, se o objeto "Hello World!"pertencer ao tipo String ou classe String ? Ou talvez ambos?

user2236096
fonte
24
Ultimamente, parece haver uma inclinação para votar negativamente em quaisquer questões do estilo "iniciante", sejam elas boas ou não. É irritante, para dizer o mínimo.
nico_c
9
Também para votar contra qualquer questão que o eleitor não entenda ...
Marquês de Lorne
4
Eu concordo que é meio rude votar negativamente enquanto você diz perguntas para iniciantes, mas, seja bom ou ruim, todas as perguntas para iniciantes têm suas respostas apenas pesquisando na web. O problema e a razão pela qual as pessoas estão votando negativamente é porque isso está levando a um estouro de pilha :)
Marko Lazić
13
Esta é uma ótima pergunta - e os 3 votos para fechar são o motivo pelo qual precisamos votar para manter a abertura . Ainda me lembro de quando estava aprendendo Java que o jargão OO era o maior obstáculo.
Lawrence Dol de
4
@nickecarlo Costumava haver um ponto no FAQ, que parece ter sido retirado durante o ano passado ou assim - "a questão mostra uma séria falta de pesquisa e não mostra sinais de esforço feito para resolvê-la antes de fazer a pergunta " Acho irritante que haja MUITAS perguntas besteiras que o Google poderia resolver, em vez de as pessoas aqui realmente perderem seu tempo explicando "programação 101" para os outros.
TC1 de

Respostas:

123

Uma classe é um tipo. Uma interface é um tipo. Um primitivo é um tipo. Uma matriz é um tipo.

Portanto, cada tipo também é uma classe (incluindo uma constante enum), uma interface, um primitivo ou um array.

Existem duas categorias distintas de tipos: tipos primitivos e tipos de referência:

  • Uma variável de tipo primitivo sempre mantém um valor primitivo desse mesmo tipo. Esse valor só pode ser alterado por operações de atribuição nessa variável.
  • Uma variável do tipo de referência sempre contém o valor de uma referência a um objeto. Todos os objetos, incluindo arrays, oferecem suporte aos métodos de classe Object. Os tipos de referência são tipos de classe (incluindo tipos de enum), tipos de interface e tipos de array.

Cada pedaço de dado tem um tipo que define sua estrutura, ou seja, quanta memória ele ocupa, como é organizado e, mais importante, como você pode interagir com ele.

Exemplos de tipos primitivos:

  1. int
  2. float
  3. char
  4. boolean

Exemplos de tipos de classes:

  1. String
  2. Integer
  3. Boolean
  4. ArrayList
  5. StringBuilder

Exemplos de tipos de interface:

  1. Collection
  2. List
  3. Map
  4. Serializable

Exemplos de tipos de matriz:

  1. int[]
  2. String[]
  3. Integer[][][]

Basicamente, qualquer coisa a que você possa se referir como uma variável tem um tipo e as classes são uma espécie de tipo.

Mais informações aqui: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html

Brandon
fonte
6
Não se esqueça dos arrays.
Paul Bellora
1
Não vou fazer a edição sozinho porque não tenho certeza se é isso que você pretendia escrever, mas pode funcionar melhor dizendo que classes são "um tipo de tipo" em vez de "um tipo de tipo".
um CV
@ MichaelKjörling Sim, essa é a melhor maneira de dizer isso. Vou atualizá-lo.
Brandon
3
Você esqueceu o tipo nulo (consulte JLS 4.1).
user1803551
1
@AndyDong Uma classe abstrata ainda é uma classe.
Brandon
6

TLDR - Classe é um do Tipo em Java.

Observação - para entender completamente a resposta, você deve ter uma pequena ideia sobre os genéricos em Java.


Para entender a diferença, vamos primeiro entender o que é um tipo em Java.

De acordo com JLS SE 10 ,

Existem dois tipos de tipos na linguagem de programação Java: tipos primitivos ( §4.2 ) e tipos de referência (§4.3).

O que é tipo primitivo?

a) Os tipos integrais são byte, short, int e long , cujos valores são inteiros de dois complementos com sinal de 8 bits, 16 bits, 32 bits e 64 bits, respectivamente, e char, cujos valores são 16 bits inteiros sem sinal que representam unidades de código UTF-16 (§3.1).

b) Os tipos de ponto flutuante são float , cujos valores incluem os números de ponto flutuante IEEE 754 de 32 bits, e double , cujos valores incluem os números de ponto flutuante IEEE 754 de 64 bits.

c) O tipo booleano possui exatamente dois valores: verdadeiro e falso.

Agora, vamos ver o que é tipo de referência?

Existem quatro tipos de referência: tipos de classe ( §8.1 ), tipos de interface ( §9.1 ), variáveis ​​de tipo ( §4.4 ) e tipos de matriz ( §10.1 ).

Vamos discutir um por um.

Se você vir como no JLS, a classe é definida assim:

Uma declaração de classe especifica um novo tipo de referência nomeado.

Existem dois tipos de declarações de classe: declarações normais de classe e declarações enum .

ClassDeclaration:
NormalClassDeclaration 
EnumDeclaration
NormalClassDeclaration:
{ClassModifier} class TypeIdentifier [TypeParameters] [Superclass] [Superinterfaces] ClassBody

Veja isso [TypeParameters], isso mostra que o tipo de classe inclui essas classes genéricas também.

class Example<T>{

}

O tipo de classe será chamado Example

Resumindo, um tipo de classe cobre nossos enums, nossas classes regulares (não genéricas) como Stringetc e nossas classes genéricas também.

Da mesma forma, espero que os tipos de interface e array também estejam claros. Por tipo de array queremos dizer como int[], String[]etc.

Vamos para a última parte - variáveis ​​de tipo. O que eles são ?

Uma variável de tipo é um identificador não qualificado usado como um tipo na classe, interface, método e corpos do construtor.

Vamos entender pelo exemplo no JLS abaixo dele.

class Test {
    <T extends C & I> void test(T t) {  
        t.mI();           // OK
        t.mCPublic();     // OK 
        t.mCProtected();  // OK 
        t.mCPackage();    // OK

    } 
}

Você vê que seu objeto no parâmetro do método é do tipo T. Sim, esta Té a variável de tipo e é / pode ser usada como uma referência. Sim, ele é. (Não foi possível entender este exemplo estranho - Aprenda o que é método genérico em Java)

Isso completa a resposta.

Número945
fonte
4

"Tipo" é a categoria mais abrangente. Variáveis ​​em Java podem ter três tipos de tipos: os 8 tipos "primitivos" como int e float, interfaces e classes. Os valores (em oposição às variáveis) podem ser instâncias primitivas ou de classe.

Lee Daniel Crocker
fonte
2

"Tipo" define 'que tipo de dados é'

Ex: "hello world" é uma String -> "hello world" é o tipo String (String não é um dado pré-conjunto ao contrário de int .. então podemos dizer que "hello world" é um tipo de classe de string)

10 é um int -> 10 é um tipo de dados inteiro.

Satya
fonte
5
Tenha cuidado ao usar inteiro para explicar um int, pois Integer! = Int em Java.
nico_c