Construtor é método ou não?

Galera, como todo bom usuário do fórum dei uma pesquisada antes de postar. A questão é a seguinte:

Construtor é um método ou não?

Segundo a apostila da Caelum construtor não é método pois:

Construtor: um método especial? Um construtor não é um método. Algumas pessoas o chamam de um método especial, mas definitivamente não é, já que não possui retorno e só é chamado durante a construção do objeto.

também em uma outra ocasião aqui no fórum:

http://www.guj.com.br/posts/list/15/43692.java#230567

Post do amigo Diego.

As professoras nas aulas de Java sempre falam “Método Construtor…blá blá blá”…

não podemos obrigar ninguem sobre isso se é ou não, mas alguem ae teria algum link da Sun(dela ninguem pode contestar) sobre esse assunto se construtor pode ser considerado um método ou não?

Vlw…(acho q isso seria mais uma enquete)…

Para a JVM é um método estático especial, cujo nome interno é “<init>”, e é tratado de modo um pouco diferente dos métodos normais.

É para não confundir sua nobre cabecinha que se diz que “construtor não é um método”.

ta, mas nos cursos é passado que ele é um método…

[quote=thingol]Para a JVM é um método estático especial, cujo nome interno é “<init>”, e é tratado de modo um pouco diferente dos métodos normais.

É para não confundir sua nobre cabecinha que se diz que “construtor não é um método”. [/quote]

Odeio quando usam “mentirinhas” para não confundir nossas cabecinhas…

  • O construtor não é herdado, mesmo sendo public…
  • O construtor não pode usar alguns modificadores que se aplicam a métodos…como final
  • O construtor não possui retorno
  • etc…

Portanto, não vejo sentido em dizer que é um método, independente do modo que a JVM trata, afinal método especial não é método, é método especial…rssss

Agora, na minha opinião, histórinha é dizer que o contrutor é um método usado para inicializar o objeto, como já ouvi muito por ai,… contrutor é construtor… nos docs da sun é comum ver "…The declaration for a method or a constructor ", ou seja, conceitos diferentes…

Essa questão gera muita polêmica e não há muito consenso.

Para a linguagem java, os construtores não são métodos. Mas para a JVM os construtores são métodos. :shock:

Outra coisa interessante é que se você tentar usar reflection para obter um construtor que não existe, é lançada a exceção NoSuchMethodException. Não existe uma exceção NoSuchConstructorException.

1 curtida

Depende como é empregado o uso da palavra método, algumas pessoas que trabalham comigo simplesmente chamam os métodos de " função " ( acostumados com outras linguagens ) …

Método é a forma como fazemos alguma coisa… Construtor pode ser considerado um método de se construir um objeto…

Também tive um professor que teve a coragem de perguntar na prova quais os tipos de métodos, e uma das respostas era " método construtor " ele me deu errado na questao… mas enfim … também sou da turma dos que defendem que construtor NÃO É MÉTODO.

Abraços

Pela definição da linguagem, em http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8 :

e

Então pela definição da linguagem, como um construtor não é um membro e um método é um membro, deduz-se que um construtor não é um método.

Ou seja: a JVM considera construtores como métodos especiais, mas a definição formal da linguagem diz que construtores e métodos são coisas completamente distintas. Na verdade, e é isso que confunde horrores os principiantes, você pode ter um método com o mesmo nome da classe :stuck_out_tongue:

Não dá pra discutir que construtores e métodos tem características em comum. São diferentes, mas tem muita coisa em comum. Talvez fosse até possível dizer que existe uma “superclasse” para construtores e métodos, e que os dois seriam especializações dessa classe.

Aí vai mais de entender O QUE cada um está chamando de metodo, se é essa “superclasse” ou se é o método mesmo. Eu costumo chamar tudo de método, mas entendo perfeitamente a diferença entre o construtor e os métodos “normais”. E acho que mais importante do que chamar de uma coisa ou de outra é entender o conceito por trás das duas coisas.

Em tempo, no java.lang.reflect:

public final class Constructor extends AccessibleObject implements Member public final class Method extends AccessibleObject implements Member public final class Field extends AccessibleObject implements Member

Na minha opinião era um método, agora fiquei na dúvida.
Mas era um método restrito. Onde a restrição básica é ter o nome da classe, não retornar valor e ser executado na criação do objeto. Qdo aprendemos sobre orientação a objetos de forma teórica também é mostrado que um objeto encapsula informações, tais informações são divididas em métodos e atributos. E os métodos dão acessos aos atributos. Pensando assim eu diria que o construtor é um método.
Mas olhando no site da Sun, parece que no Java são diferenciados. Mas isso é assim em outras linguagens orientadas a objeto tbm?

[quote=Thiago Domingues]Galera, como todo bom usuário do fórum dei uma pesquisada antes de postar. A questão é a seguinte:

Construtor é um método ou não?

[/quote]

Classes têm membros. Existem dois tipos de membros: os que contêm informação e os que processam informação.
Os primeiros são chamados atributos, ou segundos são chamados metodos.
O construtor é portanto um método porque processa informação.

Agora a pergunta: todos os metodos têm as mesmas regras ?
Não.

Metodos estáticos tem regras diferentes dos não-estáticos e dos metodos construtores no que toca a herança ,a retorno e à propria forma de invocação. Contudo, todos são métodos.

A sua pergunta “Contrutor é metodo?” tem uma resposta simples : sim.
Mas aquilo que vc quer perguntar “Construtor tem as mesmas propriedades que os metodos comuns?” tem uma resposta menos simples: não

O bloco estático é um método?

construtor não é um método: nao é herdado, nao pode ser chamado duas vezes, nao existe invocacao virtual etc,

mas como o thingol falou, internamente, na JVM, ele é tratado como um metodo especial, sem essas caracteristicas que citei. mas isso pouco importa… o que importa eh a JLS, e pra JLS construtor não é um metodo.

Até porque em outras VMs ele pode não ser tratato como um método especial, pode ser tratato como um construtor rs, mas para a linguagem não é método, como já citado.

acho que como a JVM acha, trata sobre o construtor pouco importa a nivel de programacao para o desenvolvedor e sim ele saber que ele nao é um metodo e pq nao né…
Isso sim é essencial… se for analisar como a JVM trata cada coisa… o bicho pega…

Contrutor pra mim não é exatamente um “Método”…
Depende muito da definição da palavra método.

Mais a quem diga que é…

o bloco estático não é um membro

[quote=Paulo Silveira]construtor não é um método: nao é herdado, nao pode ser chamado duas vezes, nao existe invocacao virtual etc,

[/quote]

Por essa logica um método estático tb não seria um metodo já que ele não pode ser herdado.
(não entendi o que significa “ser chamado duas vezes” )

Quando resolvi colocar esse tópico sabia q ia gerar grande polêmica entre nós usuários.

Só respondendo o nosso amigo THINGOL não creio que usuários do GUJ tenham essas tais “cabecinhas” que possam ser enganadas.

GUJ é um fórum de pessoas interessadas em Java e qualquer questão conceitual acho que é bem vinda. Mudei minha opinião sobre construtor. Pra mim construtor não é método, seguindo o conceito da Sun. Mas a opinião de cada um deve ser respeitada.

Em outras VMs ele teria que ser tratado exatamente do mesmo jeito, senão essa vm não seria compatível com a JVM :slight_smile: