Ir ao conteúdo

Posts recomendados

Postado

Pessoal sei que é uma dúvida meio besta em relação a porrada de conteúdo que existe sobre a palavra chave new e sobre instâncias

Qual realmente a diferença entre as duas declarações abaixo : 
 

class teste(){
public:
  int x;
  int y;
};
  	

e em sua declaração dentro da classe main:

teste t1;
teste t2 = new teste();

qual a diferença nas declarações ? a instancia é isso ? e quando usar ? muito obg!

Postado

bom, sinceramente smp tive duvidas quanto a isso também, mas pelo que entendo sobre o assunto, (mlr outra pessoa responder pra confirmar), 

mas no teste t1, você simplesmente criou uma variavel do tipo teste..,

ja no teste t2 , voce criou e ja atribuiu valores com o metodo construtor teste().

bom, se você não sabe bem o que é o metodo construtor, da uma estudada sobre ele que vai entender o que quis dizer.

Postado

Sei o que é construtor, mas quando um objeto é criado e não é passado nada ao construtor, ele fica como um construtor padrão, então creio que nas duas declarações, ambos tenham sido criados... Andei pesquisando, e vi que instanciar seria uma maneira diferente de dizer "criar" ... alguem que saiba, que me corrija se possivel..

Postado

Olá, bom dia.

 

Se você não definiu nenhum construtor padrão, todas as variáveis que não tiverem valores explícitos ficarão com valor null ou em caso de int, double, boolean, etc, como 0 ou false, já que esses tipos nativos não possuem valor nulo.

 

Eu sempre recomendo fazer os dois construtores pois daí você sabe exatamente o tipo de retorno de cada variável e não precisa ficar testando pra nulo, etc.

 

Exemplo:

 

public class Teste {
  
 private String nome;
  private String cpf;
  private int idade;
  private double salario;
  private String endereco;
  
  //Aqui, criaremos o construtor padrão, ou seja, 
  //sem nenhum valor passado por parametros
  public Teste() {
    this.setNome("");
    this.setCpf("");
    this.setIdade(0);
    this.setSalario(0.00);
    this.setEndereco("");
  }
  
  //Aqui o constutor com os valores passados por parametro
  public Teste (String nome, String cpf, int idade, doubla salario, String endereco) {
    this.setNome(nome);
    this.setCpf(cpf);
    this.setIdade(idade);
    this.setSalario(salario);
    this.setEndereco(endereco);
  }
  
  //Aqui ficam os getters e setters de cada variavel. 
  //Faca as validacoes dos dados dentro dos setters
  //Um exemplo de validacao do setter para a variavel nome
  
  public void setNome(String nome) {
    //Neste exemplo simples, apenas vamos verificare se não 
    //foi passado aqui uma String com valor nulo. 
    //Caso positivo, nome será uma String em branco. 
    //Caso negativo, a variável nome da classe Teste vai 
    //receber o valor da variavel nome passada no setter
    if (nome == null) {
      this.nome = "";
    } else {
      this.nome = nome;
    }              
  }  
}

Dessa forma, quando criarmos uma nova instância do objeto Teste

 

Teste novoTeste = new Teste();

Teremos certeza que todas as variáveis do tipo String foram inicializadas e como valor uma String vazia, as variáveis do tipo int como 0 e as variáveis do tipo double como 0.00;

 

Então, você pode através de setters ir atribuindo valores individualmente às suas variáveis ou simplesmente usar o construtor completo caso já tenha todos os dados que precisa ao instanciar ele.

Postado

Certo @TwistedSoul , então, "new" seria uma instancia de um objeto, eu vim do C/C++, e ao fazermos uma classe e declaramos ela :
 

Teste teste1;

podemos tranquilo, digamos que o compilador deixa...
Já em JAVA, ele não permite, vi uma explicações pelos forúms afora que:
ao declarar como acima "Teste teste1" estamos declarando uma planta de uma casa, ou seja, não está sendo salvo em uma memória ilimitada (Até o tamanho da sua RAM) e quando fazemos Teste teste1 = new Teste();, estamos a criando de fato, tirando do papel da planta e fazendo... Isso é certo ? fico com uma certa dúvida de quando usar e quando não usar new
Obrigado!

Postado

@RafaelGSS Você SEMPRE vai precisar usar new para instanciar um novo objeto.

 

Teste teste1;

Em java você sempre precisa usar o new quando for usar um novo objeto pela primeira vez. Exceção são tipos nativos.

 

No caso acima, teste1 será um objeto nulo, pois existem apenas referencia ao objeto Teste mas ele nunca foi instanciado/inicializado. Seria como reservar uma área de memória para armazenar alguma informação mas nunca ter colocado nada lá.

 

Então, se você, por exemplo, tentar usar

 

teste.getX();

Vai receber um erro de NullPointerException.

 

Se você fizer um teste do tipo

 

Teste teste1;

if (teste1 == null) {
  System.out.println("Objeto nulo. Precisa usar new");
} else {
  System.out.println("Objeto Inicializado/Instanciado. Não precisa usar new");
}

Nesse caso, você sempre vai receber a mensagem "Objeto nulo. Precisa usar new".

 

Se fizer 

Teste teste1 = new Teste();

if (teste1 == null) {
  System.out.println("Objeto nulo. Precisa usar new");
} else {
  System.out.println("Objeto Inicializado/Instanciado. Não precisa usar new");
}

Sempre vai receber a resposta "Objeto Inicializado/Instanciado. Não precisa usar new".

adicionado 16 minutos depois

 

 

@RafaelGSS Esqueci de explicar uma coisa importante:

 

Se você fizer

 

Teste teste1;

teste1.setX(0);

//OU

teste1.getX();

O compilador logo vai te avisar que o objeto teste1 não foi inicializado e vai falhar. Isso evita que você tente fazer alguma operação com um objeto nulo.

 

Claro, dependendo do que você vai programar, um método pode retornar um objeto nulo por causa de algum teste ou validação de negócio que você precisa fazer. Nesse caso, ao obter a resposta de um método que retorne o objeto específico, SEMPRE teste para null.

 

Eu sempre evito objetos nulos nas minhas respostas (a não ser quando não há outra maneira). Como eu sempre atribuo valores padrão no construtor dos meus objetos de dados, eu uso um método isGenerico() para fazer a validação. Se os valores da PK do objeto forem os padrão, eu entendo que o objeto não retornou nenhuma informação e trato de acordo. Se a PK for diferente dos valores padrão, então veio algum dado. Porque faço isso? Para evitar um nullPointer. 

 

Ao receber um NullPointer de erro na tela, você possui dois erros no seu código:

 

- O primeiro é ter devolvido ou manipulado um objeto nulo

- O segundo é não ter tratado esse erro

 

Abraço

  • Curtir 1
  • Membro VIP
Postado

Só um pequeno adendo:

Em 24/04/2017 às 16:53, TwistedSoul disse:

@RafaelGSS Você SEMPRE vai precisar usar new para instanciar uma nova classe.


Como você mesmo comenta... seria "instanciar um novo objeto". A classe seria um "molde do objeto",  correto? :)

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!