No construtor ou fora dele

Olá, pessoal,

Estou precisando entender o seguinte, eu nunca sei se devo criar determinados objetos no construtor da classe ou fora do construtor. Estou fazendo isso assim sem uma razão lógica, faço mas não entendo porque faço. Não é legal aprender uma coisa sem saber o motivo.

Se eu tenho que criar dois objetos Font e um objeto Color, para usar em JLabel e em JTextField, não sei se devo criar os objetos fora do Construtor, assim:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MeuPrograma extends JFrame
{
     JTextField T1;
     JLabel L1, L2;
        
     Font arial14 =new Font("Arial", Font.BOLD, 14);
     Font arial20 =new Font("Arial", Font.PLAIN, 20);
     Color brown = new Color(128,000,000);

     public MeuPrograma()     // construtor
         {
            setTitle("Título do programa");
            setVisible(true);
            setSize(250,160);
            setLocation(60,60);
            getContentPane().setBackground(Color.gray);
            getContentPane().setLayout(null);
                       
            L1 = new JLabel("Nota do aluno");
            L1.setLocation(20,100);
            L1.setSize(70,20);
            L1.setFont(arial14);
            L1.setForeground(brown);
  
            T1 = new JTextField(12);
            T1.setLocation(100,110);
            T1.setSize(60,30);
            T1.setFont(arial20);
            
            // o código não termina aqui

Ou qual seria a razão que eu teria para colocar dentro do construtor? Quando é que eu devo usar uma coisa ou outra?, assim:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MeuPrograma2 extends JFrame
{
     JTextField T1;
     JLabel L1, L2;
        
     public MeuPrograma2()     // construtor
         {
            setTitle("Título do programa");
            setVisible(true);
            setSize(250,160);
            setLocation(60,60);
            getContentPane().setBackground(Color.gray);
            getContentPane().setLayout(null);

            Font arial14 =new Font("Arial", Font.BOLD, 14);
            Font arial20 =new Font("Arial", Font.PLAIN, 20);
            Color brown = new Color(128,000,000);
                       
            L1 = new JLabel("Nota do aluno");
            L1.setLocation(20,100);
            L1.setSize(70,20);
            L1.setFont(arial14);
            L1.setForeground(brown);
  
            T1 = new JTextField(12);
            T1.setLocation(100,110);
            T1.setSize(60,30);
            T1.setFont(arial20);
            
            // o código não termina aqui

Amigos, é claro que esses dois códigos estão incompletos, não liguem para isso, eu só preciso entender quando é que eu faço uma coisa ou quando é que devo fazer a outra? Se vocês puderem me dar essa dica, valeu!

Abraço a todos,
Marco

Não se minha explicacao sobre isso eh o q vc deseja, talvez seja até trivial demais. Mas vamos lá.
Tudo que há dentro do construtor será executado quando vc o chamar a partir de uma outra classe. Por as vezes se tem um construtor vazia numa classe, para vc instanciar o objeto sem acontecer ‘nada’. Mas qdo vc instancia um objeto, no qual seu constutor possui métodos, atribuicaod e valores, etc, isso tudo acontecerá no momento em q vc instancia essa classe a partir deste construtor. Ajudei? Atrapalhei? ou nao falei nada com nada? :grin:

ah… outro detalhe. se vc tem um código dentro do construtor, vc nao conseguirá usá-lo no restante da classe, apenas dentro do construtor. Isso é algo óbvio, já q o q está no construtor, seja metodo ou atributo, sao locais. Mas custei até perceber isso.

Ao kopcheski,

Cara, tudo o que alguém fala aqui é ótimo, você falou coisas que me ajudaram, com toda certeza, e eu só tenho a agradecer, pudesse eu ajudar aos outros assim como você me ajudou. Mas ainda não é isso o que eu preciso saber. Minha pergunta é mais ou menos assim:

Será que tanto faz criar aqueles objetos Font e Color fora do construtor ou dentro do construtor? É indiferente? Se eu crio o objeto Color fora do contrutor, posso usar dentro do construtor? Qual a melhor forma? Quando eu devo usar um caso e quando eu devo usar o outro? Se alguém me responder isto eu acho que entendo a questão.

Mas, com as coisas que você falou eu aprendi outras coisas, então você pergunta se ajudou ou atrapalhou, é claro que ajudou muito, e eu agradeço a você. É que a coisa é barra mesmo! Pelo menos pra mim.
Abraço amigo,
Marco

bom cara
uma dica que eu posso dar, é você colocar no contrutor tudo o que vc precisa do objeto AO INSTANCIAR este objeto

vamos pegar por exemplo uma classe Pessoa, que tem um atributo “nome”

toda pessoa tem um nome, então não faz sentido vc criar uma pessoa sem um nome

logo, vc faria o seguinte no construtor:

public Pessoa(String nome) {
     this.nome = nome;
}

Bom dia.
Olha Marco, com relação ao construtor ele é apenas para inicializar obletos com algumas opções padrão (definidas por vc) os seus atributos.

Tudo que tiver fora do construtor vc pode usar depois (mudar) tipo assim: seu L1 = new JLabel(“Nota do aluno”); quando instanciado o objeto ja inicializa com “Nota do aluno” mas, se vc quiser depois alterar L1 pode.

Em relação a quando devo, você é que vai decidir se precisa de valores default em atributos ou não no momento de new.

Espero ter ajudado.

Entao, isso depende do onde mais vc precisa usar o Color. Se vc o declarar dentro do Método Construtor então vc nao poderá usá-lo fora. Se declarar fora do construtor, poderá usá-lo dentro do construtor. A menos, claro, q vc o declare dentro de outro método.

Pq veja, o construtor, nada mais eh do q um método. O que vc declara dentro dele é local. Só pode ser usado dentro dele. Mas o q vc declara na classe, é global, entao vc pode usar tanto dentro, como fora do construtor. Era isso q ficou faltando?

Qualquer coisa, falae de novo… :slight_smile:

Ao SadNess,
Cara, entendi sua explicação, valeu, obrigado pela ajuda. Um grande abraço.

Ao Marvix,
Tudo bom, cara? Se você diz que sou eu é que decido sobre isso, então melhorou para mim, eu pensava que fosse uma coisa ou outra, mas não opcional. Valeu essa dica. Abraço.

Ao Kopcheski,
Agora você falou tudo o que eu precisa saber, eu não via o construtor como mais um método, achava que era um elemento especial do código que permitia mostrar as coisas na janela do aplicativo. Quando você escreveu aí que ele nada mais é do que um método, aí eu me toquei que realmente. um método que tem que levar o nome da classe, isso eu sei, mas qual é o objetivo de se ter um construtor? Fazer os componentes aparecer na janela do aplicativo? Será que é isso? Ou ele tem outras funções?

Sua última mensagem melhorou meu entendimento, mas ainda gostaria de saber o seguinte: Se eu declaro(instancio) aqueles objetos Font e Color no construtor, se eu tiver que usar outro método dentro dessa mesma classe, mas outro método qualquer, como eu faço para dentro desse outro método o objeto Font ou Color instanciado no construtor ser reconhecido pela outra classe? Reconhece direto, ou tenho que fazer algo?
Abraço,

Marco

Eu estou perguntando essas coisas porque eu sinto que isso é o que faz entender a linguagem, não é decorar e sair fazendo de qualquer jeito.

Eu já aprendi que dentro de uma classe existem só duas coisas : atributos e métodos. E pode ser que só existam métodos , sem atributos. Exemplo:

public class Programa1
  {
     public static void main(String[] args)
       { 
          System.out.println("Não tem atributo");
       }
  }

Mas essa classe Program1 poderia usar um atributo dentro da classe, mas fora do método. Assim:

public class Programa1
  {
    String texto = "Esse tem atributo";
     
     public static void main(String[] args)
       { 
          System.out.println(texto);
       }
  }

Mas o que eu desejo saber é se eu posso usar assim também, colocando o atributo já dentro do método:

public class Programa1
  {
     public static void main(String[] args)
       { 
          String texto = "Esse tem atributo dentro do método";
          System.out.println(texto);
       }
  }

Eu fiz as 3 formas como teste e tudo roda, mas eu fico sem saber qual é a melhor forma, se é usando o atributo fora do método ou dentro do método? Se alguém comentar seria ótimo.
Marco

Uma comparação com a Linguagem C.
Atributo seria a mesma coisa de uma variável global, pode ser usada por todas as funções (métodos). Já dentro de uma função (método) ela se torna uma variável local, só pode ser usada dentro do método.

Os atributos são variáveis globais, dentro dos métodos são variáveis locais e não atributos.

Um abarço.

Marvinx,

Cara, essa comparação que você fez de atributos com variáveis globais, valeu pra mim, porque eu conheço um pouco de Visual Basic, e aí lembrei de como era esse lance no VB, mas em Java eu tenho dificuldade de sacar muitas coisas, mas tô melhorando com a ajuda de vocês. Valeu, um abraço!

Tá, vamos pelo método do Jack Estripador… vamos por partes:
1- Qdo vc instancia um objeto de uma classe em outra classe, acontece o seguinte:

private Classe1 cl1 = new Classe1();

Legal, qdo vc faz isso, vc executa o seu construtor. Veja, Classe1() é o seu construtor, já q uma classe nao tem (). Nao tem nada a ver com o q aparece na tela. O construtor serve para ser chamado no momento em q vc instancia um objeto desta Classe1 em outra classe. Se tiver código dentro do construtor, esse código será executado. new Classe1() é uma chamada ao método, entao este método será executado, tendo código dentro dele ou nao. E lógico, o cl1 passara a ter dar acesso ao conteúdo da Classe1.

2- Se está dentro do construtor, apenas o construtor tem acesso a estas variáveis Color e Font. Se nao me engano, os amantes da OO chamam variaveis de classe , de atributo, e as variaveis de método, de variáveis. Se vc precisa ter acesso a estes atributos pelos demais metodos da sua classe, entao vc as declara globais, ou seja, fora do construtor, na classe.

3- Todas as formas servem, mas é aquilo, depende do uso q vc vai ter destes atributos.

E por fim, o meu entendimento de método construtor é o seguinte. Vendo pela minha classe, a Classe1, vamos usá-la como exemplo. O construtor nada mais é do q um método qualquer dentro da minha classe. Ele só vai se diferenciar no seguinte. Quando vc instancia um novo objeto da sua classe, o conteúdo de um dos métodos da classe será executado. E adivinha qual? É, o truta, o construtor…

Depois vc vai perceber, ou até ja saiba disso. Q vc pode ter mais de um construtor na sua classe. E isso tb é interessante. Certo?

Qualquer coisa q eu tenho deixado passar, avise.

[]'s[/b]

Ao kopcheski,

Cara, isso melhorou demais meu entendimento, muitas dúvidas você acaba de tirar, mas mesmo assim, ainda fico sem saber algumas coisas. Você disse

private Classe1 cl1 = new Classe1();

No meu entendimento (que não é bom) esse cl1 nada mais é do que um objeto criado com as propriedades(atributos e métodos) da Classe1. Mas você diz que não é da classe, mas do construtor, ou seja, do método Classe1(). Isso tá confuso para mim, porque até agora eu achava que objeto só poderia ser criado de uma classe, não sabia que se pode criar um objeto de um método. Mas veja, tô no início da linguagem Java, o que eu falo não se assina embaixo! Mas, para mim, quando se cria um objeto, é para fazer referências aos atributos e métodos de uma classe (e não de um método). Então, me perdi nessa explicação sua.

Mas, tem uma parte do que você falou, que esclareceu tudo o que eu não sabia, quando você disse:

Eu já fiz essa pergunta muitas vezes, mas só agora entendi, com sua resposta. Entendi assim, só colocando na classe é que eu posso usar as variáveis a partir de outros métodos, mas se eu coloco a variável diretamente em algum método não tenho como usar essa variável em outro método. Mas eu pergunto, nem se eu utilizar aqueles modificadores de acesso: public, private e protected?

Gente, eu agradeço a todos que estão participando deste tópico, todos me ajudaram. Abraço pra vocês.
Marco[/quote]

Talvez nao consegui expressar o q eu queria.
cl1 é realmente um objeto da classe, assim como vc diz entender. Eu quis ilustrar que, qdo vc escreve new Classe1() vc está chamando o método construtor e executando seu conteúdo. E reiterando, cl1 eh um objeto da classe sim, da forma q vc me disse. Qdo vc declara String str eh a mesma coisa de se declarar Classe1 cl1. Vc diz q str é uma string, e cl1 eh um Classe1. Ok?!

Ao kopcheski,

Ficou bem claro com essa sua explicação, entendi perfeitamente. Eu é que fiz confusão na sua explicação anterior. Cara, tô na fralda ainda nessa coisa da linguagem java, desculpe as minhas dificuldades. Mas muita coisa que você disse aí acima me ajudou demais, conto com você.

Abraço, amigo.
Marco