2012-01-06 20 views
8

Cuándo es necesario utilizar la palabra clave new en Java. Sé que se supone que para usarlo cuando se crea una instancia de un objeto como éste:¿Cuándo es el momento apropiado para usar la palabra clave 'nueva'?

TextView textView = new TextView(this); 

veces en el código noto que new no se utiliza y que se confunden .. En esta línea de código:

AssetManager assetManager = getAssets(); 

Por qué no es una instancia de la AssetManager creado de esta manera:

AssetManager assetManager = new AssetManager(); 

entonces se le asigna igual a getAssests()?

¿Cuándo se debe usar new?

Gracias!

Respuesta

9

Utiliza la palabra clave nueva cuando un objeto se crea explícitamente por primera vez. A continuación, no es necesario obtener un objeto con un método getter nuevo porque el objeto ya existe en la memoria, por lo que no es necesario volver a crearlo.

si desea una descripción más detallada de la nueva visita the oracle docs

Un objeto tendrá la 'nueva' palabra clave si es nulo (que es de lujo para no inicializado).

EDIT:

Esto imprimirá siempre "necesita nuevas" en las actuales circunstancias.

Object mObj = null; 
if (mObj == null) 
    System.out.println("needs new"); 
else 
    System.out.println("does NOT need new"); 

OUTPUTS: needs new 

Así que para solucionarlo, usted haría algo como:

Object mObj = new Object(); 
if (mObj == null) 
    System.out.println("needs new"); 
else 
    System.out.println("does NOT need new"); 
OUTPUTS: does NOT need new 

Y en esas circunstancias siempre vamos a ver "no necesita una nueva"

+0

¿Cómo se puede saber si un objeto ya se ha creado? – foobar5512

+0

Cuando intente hacer referencia a él, será nulo. Puede verificarlo por algo como (consulte mi actualización) – AedonEtLIRA

+1

. Obtiene esta información de la documentación, o experiencia. Por ejemplo, los administradores a menudo se usan como singleton (o similar), por lo que solo hay una instancia. Este tipo de clases no se crean, pero hay una función para recuperar el objeto. –

2

Mediante el uso de new que asignar memoria para el objeto.

El uso de un getXXX() se utiliza para obtener un objeto existente que ya está asignado.

2

El nuevo se usa cuando llamas al constructor para una función. getAssets() devuelve un AssetManager, no necesita crear uno nuevo.

2

Puesto que usted notificado este con [Android], supongo que su código está dentro de un Activity o Service. En este caso, getAssets() es un método de la clase que está extendiendo. Entonces, realmente no lo está creando, le está pidiendo al código existente que le proporcione una referencia a lo que ya existe.

0

observe la letra mayúscula en TextView, y la falta de ella en getAssets. getAssets no es una clase como TextView, es un método que devuelve un objeto. Y como muchos otros mencionaron, su activo ya existe.

5

En java siempre tiene que usar new para crear instancias de objetos (bueno, casi siempre). Con getAssests() recuperas una ya creada.Supongo que su pregunta proviene de C++, donde new asigna memoria dinámica, pero como java solo tiene objetos dinámicos, siempre se necesita nueva.

3

new siempre se utiliza para crear objetos nuevos.

este

AssetManager assetManager = getAssets(); 

se acaba de asignación de un valor devuelto por el método getAssets() para hacer referencia a assetManager.

[editar]

mentí sobre new es posible hacer algo como esto:

Foo.class.newInstance(); 

y también se puede utilizar la reflexión:

Foo.class.getDeclaredConstructors(Class[] parameterTypes).newInstance(arguments); 
1

En Java, new MyClass()creates a new instance de MyClass y devuelve una referencia al mismo.

Mientras tanto, la declaración:

MyClass foo; 

define una variable foo que puede almacenar una referencia a una instancia de MyClass, o el valor especial null que indica la ausencia de dicha referencia. Si no hace referencia a foo, su valor predeterminado será null.

Sin duda, puede combinar estas cosas, p. de esta manera:

MyClass foo;   // define a variable foo that can store an object reference 
foo = new MyClass(); // create a new object and assign a reference to it to foo 

o, equivalentemente, de esta manera:

MyClass foo = new MyClass(); // combined variable definition and assignment 

Pero usted no tiene para crear una nueva instancia cada vez que se asigna algo a una variable de referencia. También podría hacer, por ejemplo, esto:

MyClass foo, bar;  // define two reference variables, foo and bar 
foo = new MyClass(); // create a new object and assign a reference to it to foo 
bar = foo;    // now foo and bar point to the same object 

o incluso:

MyClass foo = new MyClass(), bar = foo; // same, but shorter 

Tenga en cuenta que en Java, a diferencia de algunos otros lenguajes como C++, nunca se puede asignar (una copia de) un objeto real en una variable. Por el contrario, siempre se accede a los objetos Java mediante referencias a ellos. Cuando alguien habla de "asignar un objeto a una variable" o "pasar un objeto como parámetro" o "devolver un objeto de un método" en Java, lo que siempre significan en realidad es asignar o pasar o devolver una referencia a un objeto.


Los métodos que sus llamadas de código pueden (y suelen hacer) también devuelven referencias a objetos.Por ejemplo, si su clase tenía un método como este:

private MyClass getSomeObject() { 
    // ...some code here... 
} 

se le puede llamar y guardar la referencia se vuelve en una variable de la siguiente manera:

MyClass foo; 
foo = getSomeObject(); 

o como esto:

MyClass foo = getSomeObject(); 

Podemos decir por la declaración de método que getSomeObject() siempre devolverá una referencia a una instancia MyClass (o null), pero no donde th por ejemplo, en realidad proviene de. Eso depende completamente de lo que haga el código dentro del método getSomeObject(). El código siempre puede crear una nueva instancia MyClass con new MyClass() cada vez que se invoca, y devolver una referencia a ella, o siempre puede devolver una referencia al mismo objeto . O, por supuesto, a veces podría devolver una referencia a un nuevo objeto, y a veces a uno previamente creado.


Tenga en cuenta que, si asigna un nuevo valor a una variable, cualquiera que sea la variable contenida anteriormente será olvidada. Si el valor olvidado es la última referencia a algún objeto, ese mismo objeto será destruido por el recolector de basura de Java.

Así, por ejemplo, aunque sin duda es posible a hacer algo como esto:

MyClass foo = new MyClass(); // create a new object and assign (a reference to) it to foo 
foo = getSomeObject();  // forget the previous content of foo and replace it with whatever getSomeObject() returns 

que normalmente no tiene sentido, ya que estaría creando una nueva MyClass ejemplo solo para arrojarlo inmediatamente lejos su solo hace referencia a él y lo reemplaza con otra cosa. En efecto, el código anterior es exactamente equivalente a:

new MyClass();  // create a new object and throw away(!) the reference to it 
MyClass foo = getSomeObject(); // assign whatever getSomeObject() returns to foo 

La única vez que puede llegar incluso a distancia tiene sentido sería si quería para crear una nueva instancia MyClass e inmediatamente deja que sea basura recogida, por ejemplo, porque el constructor MyClass tuvo algunos efectos secundarios que quería activar. Pero dado que generalmente se considera un mal estilo para los constructores tener efectos secundarios no triviales (o, más en general, para hacer algo más que configurar el nuevo objeto), normalmente no debería tener ninguna excusa para escribir dicho código.

Cuestiones relacionadas