Prefácio
Como desenvolvedores de Java, criamos um grande número de objetos todos os dias, mas sempre usamos sistemas de dependência de gerenciamento (como estruturas de primavera) para criar esses objetos. De fato, existem outras maneiras de criar objetos, que apresentarei em detalhes no artigo a seguir.
1. Use novas palavras -chave
Esta é a maneira mais comum de criar objetos e também é muito simples. Ao usar esse método, podemos chamar qualquer construtor que precisarmos ligar.
Funcionário emp1 = new funcionário (); 0: novo #19 // classe org/programação/mitra/exercícios/funcionário 3: dup 4: invocespecial #21 // método org/programing/mitra/exercites/funcionário. "" :() v
2. Use o método NewInstance de classe
Também podemos usar o método NewInstance da classe para criar objetos. Esse método de NewInstance chama o construtor sem parâmetros para criar um objeto.
Podemos criar objetos usando o NewInstance () da seguinte maneira:
Funcionário emp2 = (funcionário) classe.formaName ("org.programming.mitra.exercises.employee"). NewInstance ();ou
Funcionário emp2 = funcionário.class.newInstance (); 51: InvokeVirtual #70 // Método java/lang/class.newinstance :() ljava/lang/objeto;
3. Use o método de NewInstance da classe construtora
Semelhante ao método newInstance usando a classe, existe um método de função newInstance() na classe java.lang.reflect.Constructor que pode ser usada para criar objetos. Ao usar esse método newInstance , também podemos chamar construtores parametrizados e construtores privados.
Construtor <employee> Construtor = Employee.class.getConstructor (); funcionário emp3 = construtor.NewInstance (); 111: InvokeVirtual #80 // Método Java/Lang/Reflice/Constructor.NewInstance: ([ljava/lang/objeto;) ljava/lang/object;
Esses métodos newInstance() são considerados como reflexão para criar objetos. De fato, newInstance() da classe interna usa newInstance() da classe construtora. É por isso que o último é preferido e usa estruturas diferentes, como Spring, Hibernate, Struts , etc.
4. Use o método clone
De fato, sempre que chamamos o método clone , a máquina virtual Java cria um novo objeto para nós e copia o conteúdo do objeto anterior nesse novo objeto. Criar um objeto usando clone não chama nenhum construtores.
Para usar o método clone() em um objeto, precisamos implementar o tipo clonável e definir o método clone.
Funcionário emp4 = (funcionário) emp3.clone (); 162: InvokeVirtual #87 // Método Org/Programming/mitra/exercícios/funcionário.clone () ljava/lang/objeto;
5. Use a deserivação
Sempre que serializamos e desajeitamos um objeto, a máquina virtual Java cria um objeto separado para nós. Na desserialização, a máquina virtual Java não usa nenhum construtor para criar objetos.
Serializando um objeto exige que implementemos uma interface serializável na classe.
ObjectInputStream in = new ObjecjotInputStream (new FileInputStream ("data.obj")); funcionário emp5 = (funcionário) in.readObject (); 261: InvokeVirtual #118 // Método java/io/objectInputStream.readObject :() ljava/lang/object; Como podemos ver no snippet de código de bytes acima, exceto o primeiro sendo convertido em uma nova função e uma instrução invokespecial , todos os 4 métodos são chamados e convertidos para invokevirtual .
Exemplo
Vamos dar uma olhada na aula Employee que está pronta para criar um objeto:
classe Empregado implementa clonável, serializável {private estático final serialversionuid = 1L; nome de string privado; public funcionário () {System.out.println ("Construtor de funcionários chamado ..."); } public string getName () {return name; } public void setName (nome da string) {this.name = name; } @Override public int hashCode () {final int prime = 31; int resultado = 1; resultado = prime * resultado + ((nome == null)? 0: name.hashcode ()); resultado de retorno; } @Override public boolean equals (object obj) {if (this == obj) retorna true; if (obj == null) retorna false; if (getClass ()! = obj.getclass ()) retornar false; Funcionário outro = (funcionário) obj; if (nome == null) {if (outro.name! = null) retorna false; } else if (! name.equals (outro.name)) retornar false; retornar true; } @Override public string tostring () {return "funcionário [name =" + name + "]"; } @Override public Object clone () {objeto obj = null; tente {obj = super.clone (); } catch (clonenotsupportEdException e) {e.printStackTrace (); } retornar obj; }} No programa Java a seguir, usamos 5 maneiras de criar objetos Employee .
classe pública ObjectCreation {public static void main (string ... args) lança a exceção {// usando a nova palavra -chave Employee emp1 = new funcionário (); emp1.setName ("Naresh"); System.out.println (emp1 + ", hashcode:" + emp1.hashcode ()); // usando o funcionário do método da classe de classe NewInstance () Emp2 = (funcionário) classe.ForName ("org.programming.mitra.exercises.employee") .NewInstance (); // ou podemos simplesmente fazer isso // funcionário emp2 = funcionário.class.newInstance (); EMP2.SetName ("rishi"); System.out.println (emp2 + ", hashcode:" + empp2.hashcode ()); // usando o construtor de métodos da classe de construtor NewInstance () Method <employee> construtor = funcionário.class.getConstructor (); Funcionário emp3 = construtor.newInstance (); emp3.setName ("Yogesh"); System.out.println (emp3 + ", hashcode:" + empp3.hashcode ()); // usando clone () método funcionário emp4 = (funcionário) emp3.clone (); EMP4.setName ("atul"); System.out.println (emp4 + ", hashcode:" + emp4hashcode ()); // usando deserialização // serialização objectOutputStream out = new ObjectOutputStream (new FileOutputStream ("data.obj")); out.WriteObject (EMP4); out.Close (); // deserialização objectInputStream in = new ObjectInputStream (new FileInputStream ("data.obj"); Funcionário emp5 = (funcionário) in.readObject (); in.Close (); EMP5.SetName ("Akash"); System.out.println (emp5 + ", hashcode:" + emp5.hashcode ()); }}Os resultados da saída deste programa são os seguintes:
Construtor de funcionários chamado ... funcionário [Nome = Naresh], HashCode: -1968815046 Construtor do empregado chamado ... funcionário [nome = rishi], hashcode: 78970652EmployeeeDeeDeoth chamado ... Empregado [Nome = Yogesh], Hashcode: -164129279EMPLATE [Nome = Yogesh], Hashcode: -164129272MPLANTE [Nome = Yogesh], Hashcode: -1641292792mplo [Nome = Akash], HashCode: 63313419
O conteúdo acima é de cerca de 5 métodos diferentes para criar objetos em Java. Espero que seja útil para você aprender Java. Obrigado pelo seu apoio ao wulin.com.