São perguntas básicas que eu sei aplicar no código, mas não entendo como funciona, por isso gostaria de respostas simples mas com suas palavras, pq nos materiais didáticos não consegui compreender bem, e as vezes com uma forma diferente de falar ajuda a assimilar o conteúdo.
Por exemplo, para eu usar um array de inteiro eu declaro uma variável do tipo int[] e em seguida instancio um novo objeto com o operador new, ex:
int[] array = new int[10];
então porque também da certo apenas declarar a variável sem instanciar um objeto? ex:
int[] array = {1,2,3};
int é do tipo primitivo, mas quando eu uso o operador new para criar o array eu estou instanciando um objeto, que no caso vem de uma classe, eu pensava que a classe que lidava com objetos int era a Integer…
E essa ultima duvida é a principal, para eu criar um objeto de uma classe eu declaro a variavel do tipo da classe e em seguida uso o operador new para instanciar a classe, assim:
MinhaClasse classe = new MinhaClasse();
porém em diversas situações eu sempre vejo e uso da seguinte forma mas sem entender, onde cria uma variável do tipo da classe e em vez de instanciar a classe a variável recebe um método, ex:
MinhaClasse classe = MetodoQualquer();
na minha cabeça quando você cria uma instancia da classe você pode usar seus métodos e acessar seus atributos públicos, mas e quando apenas cria uma variável do tipo da classe oque você pode fazer com ela? e que tipo de valores ela pode receber já que não é uma variável de nenhum tipo comum? pois eu só vejo ela recebendo valores de métodos que eu não conheço a fundo o tipo de parâmetro recebido, então uso pq sei que é assim que se faz, mas não entendo o porque e como
Isso é um sintax sugar para o compilador, no fim ele irá criar um new int[len] já com as posições devidamente preenchidas para você…
Todo array em java é um objeto, ao declarar int[] você está dizendo o tipo de dado que o array irá guardar e não o tipo de objeto… como o int é primitivo, a classe Integer é um wrapper ou seja, um tipo de objeto que representa um primitivo, assim como Character para char, Double para double, Float para float etc, todos extendendo a Object para melhor utilização em classes de Collections por exemplo, cujo não aceitam tipos primitivos, apenas objetos…
Isso se chama encapsulamento, o fato de você não ter dado new nessa atribuição não quer dizer que ele não foi ativado em algum outro lugar no programa… o comportamento em acessar atributos e métodos, mesmo o objeto sendo instanciado através de um método não muda nada… como o termo diz, apenas o new foi encapsulado não estando visível para você naquele momento, e o objeto está disponível para você usar da mesma forma…
A parte do array eu entendi, eu entendi muito bem a parte do açucaramento da sintax.
agora sobre essa parte do encapsulamento essa é a parte de POO que eu mais tenho dificuldade de compreender (já vi vários videos e artigos), apenas para fixar melhor
MinhaClasse classe; é a mesma coisa que MinhaClasse classe = new MinhaClasse();?
ou é que o new MinhaClasse(); ja esta instanciado quando atribui um método na variável como no caso:
MinhaClasse classe = MetodoQualquer(); pq eu vejo isso direto, por exemplo para abrir conexao no android e etc… nos metodos como comit(), conect() e etc ja tem uns operador new MinhaClasse encapsulado la?
Exato, por isso se chama encapsulamento, mantendo sempre o foco em o que fazer e não em como fazer…
Por exemplo…
public class Conta {}
public class Banco {
public Conta novaConta() {
return new Conta();
}
public static void main(String[] args) {
Banco banco = new Banco();
Conta c1 = banco.novaConta();
Conta c2 = banco.novaConta();
}
}
Percebeu que em nenhum momento o código te obriga usar o método novaConta(), mas se você estiver em um projeto e a conta para ser criada precisar de alguma validação antes… através do encapsulamento você consegue resolver essa situação ao invés de usar new Conta() diretamente…
Não. MinhaClasse classe; é apenas a declaração da variável. Uma forma de dizer ao compilador/JVM que você pretende usar um espaço de memória onde caiba um objeto de ‘MinhaClasse’.
Quando você utiliza isso MinhaClasse classe = new MinhaClasse();, você diz ao compilador/JVM que está destinando um espaço na memória onde um objeto do tipo MinhaClasse estará criado e, imediatamente, associando este objeto a uma variável, tornando o objeto acessível dentro do escopo no qual você está. Digamos que a declaração se encontra no seguinte método, dentro da seguinte classe: public class ClasseTeste { //Aqui o objeto classe ainda não existe public void teste() { MinhaClasse classe = new MinhaClasse();//Aqui o objeto classe passa a existir }//Aqui o objeto classe deixa de existir }
Uma outra parte da tua dúvida inicial era sobre o uso de MinhaClasse classe = metodoQualquerQueGeraEsteObjeto(); o @LostSoldier foi muito correto no que disse. Mas, podemos simplificar o que ele escreveu. Não existe mágica na programação, sempre que você quiser um objeto de uma determinada classe, em algum lugar vai existir o new MinhaClasse();. É fato.
Quando você avançar em teus estudos, vai encontrar coisas como inversão de controle, Spring Framework e CDI (além de outros) e encontrará coisas como ‘nunca mais use o new’. Cuidado, mesmo que você não veja, em algum lugar vai existir o new MinhaClasse(); mesmo que não dessa maneira.