2012-08-17 9 views
19

¿Es eso posible inicializar el objeto directamente como podemos ver con clase String en Java:objeto de inicialización directamente en Java

tales como:

String str="something..."; 

que quiero hacer igual para mi clase personalizada:

class MyData{ 
public String name; 
public int age; 
} 

es que sea posible, como

MyClass obj1={"name",24}; 

o

MyClass obj1="name",24; 

al inicializar el objeto? ¡o cómo puede ser posible!

+4

Como hacer constructores para el objeto? – CBredlow

+1

uhmm tal vez quiera este http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html :) –

+0

lo sé con los constructores, pero ¿hay alguna forma alternativa presente o no? –

Respuesta

0

Es posible con la palabra clave new y el uso de constructores, pero no como el String, que es un tipo de objeto muy especial.

+0

¿Me puede decir el funcionamiento de la clase String, cómo lo hago? ¡hazlo !, entonces tengo una idea para implementar para resolver mi problema. –

+0

Para ser honesto, no estoy seguro acerca de la implementación interna, sin embargo, es diferente porque cada vez que crea un literal String usando myString = "aString" en lugar de myString = new String ("aString"), solo se asigna una nueva cadena y solo si aún no está en el grupo de cadenas Java. Este grupo de cadenas de Java contiene todos los literales de cadenas que se han creado hasta el momento, por lo que solo hace referencia a ellos desde el grupo en lugar de crear un nuevo objeto de cadena cada vez. –

29

Normalmente, usaría un constructor, ¡pero no es necesario!

Aquí está la versión constructor:

public class MyData { 
    private String name; 
    private int age; 

    public MyData(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    // getter/setter methods for your fields 
} 

que se utiliza como esto:

MyData myData = new MyData("foo", 10); 


Sin embargo, si los campos son protected o public, como en el ejemplo, puede hacerlo sin definiendo un constructor. Esta es la manera más cercana en java a lo que desea:

// Adding special code for pedants showing the class without a constuctor 
public class MyData { 
    public String name; 
    public int age; 
} 

// this is an "anonymous class" 
MyData myData = new MyData() { 
    { 
     // this is an "initializer block", which executes on construction 
     name = "foo"; 
     age = 10; 
    } 
}; 

Voila!

+0

No funciona. No tiene ningún constructor 'MyData()' si ha definido un constructor 'MyData (String name, int age)'. ** editar: ** uhm .. Puede que haya malentendido aquí. ¿Estás sugiriendo eliminar el constructor por completo? – aioobe

+1

@aioobe tienes que estar bromeando ... Supuse que la gente realmente leería "sin un constructor" significando "sin un constructor" ... es decir, "define tu clase sin un constructor".jeez – Bohemian

+0

Lo leí como "puedes construir un objeto' MyData' sin usar su constructor "usando una subclase anónima. Dado su primer fragmento, no pareció funcionar para mí. (Además, estás * todavía * usando un constructor. Estoy de acuerdo con mi punto: no hay forma de evitarlo.) – aioobe

3

Tienes que hacer un método constructor para el objeto, que toma los parámetros de los campos para los que quieres valores.

Ejemplo:

public myClass(int age, String name) 
{ 
    this.age = age; 
    this.name = name; 
} 

Luego, en la clase que desea esto:

myClass class = new myClass(24, "name"); 
0
class MyData{ 

    public MyData(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 
    public String name; 
    public int age; 
    } 

A continuación, puede crear una instancia de la clase de esta manera:

MyData myData = new MyData("name", 24); 
+0

Esto parece familiar ... – Bohemian

+0

mi pregunta es para: MyClass obj1 = {"name", 24}; –

+1

, entonces la respuesta es no. ¡No puedes! – mabbas

4

Lo sé con los constructores, pero ¿alguna forma alternativa está presente o no?

No, no hay alternativas a los constructores.

Esa es básicamente una de las garantías fundamentales del lenguaje. Un objeto no puede ser construido por ningún otro medio que no sea a través de sus constructores y no existe una sintaxis alternativa, entonces el new ConstructorName(...) habitual.

La idea más cerca que puede llegar a sería tener un método de fábrica estática llamada decir, mc:

class MyClass { 
    ... 
    public static mc(String name, int age) { 
     return new MyClass(name, age); 
    } 
} 

y luego hacer

import static some.pkg.MyClass.mc; 

... 

MyClass obj1 = mc("name",24); 
+0

No, así que ... ver mi respuesta – Bohemian

+0

Todavía está pasando por un constructor (y por lo tanto tiene que escribir 'new ConstructorName' que es lo que creo que el OP quiere evitar). – aioobe

-1

No hay alternativa a los constructores (junto con el nuevo operador) en java durante la inicialización del objeto. Usted ha mencionado como

cadena str = "algo"

puede inicializar cadena de esa manera, porque es una cadena literal en java. Solo los literales pueden inicializarse de esa manera. A un objeto compuesto no se puede inicializar, pero solo se puede crear una instancia con el nuevo operador con los constructores.

4

Si usted tiene una persona de clase:

public class Person { 

    private String lastName; 
    private String firstName; 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

} 

en realidad se puede crear un nuevo objeto persona e inicializar su nombre y apellido con lo siguiente:

Person person = new Person(){{ 
    setFirstName("My FirstName"); 
    setLastName("MyLastName"); 
}} 

Esto se utiliza muy a menudo cuando se define Configuración de Spring utilizando código Java en lugar de configuración XML.

+2

Advertencia: al hacer esto, en realidad está creando una clase interna anónima, no solo inicializando un objeto. [Vea esta respuesta] (http://stackoverflow.com/a/27521360/2600833) para obtener una explicación de algunos riesgos potenciales. initializatian – Nick

0
package com.company; 

public class InitializationOfObject { 
    int a ; 
    int b ; 

    InitializationOfObject(){ 
    } 

    InitializationOfObject(int r , int n){ 
     this.a = r; 
     this.b = n; 
     System.out.println("Object initialization by constructor "); 
    } 

    void methodInitialization(int k, int m){ 
     System.out.println("object initialization via method"); 
     this.a = k; 
     this.b = m; 
    } 

    void display(){ 
     System.out.println("k = " +a+ "m = "+b); 
    } 

    public static void main(String... arg){ 
     InitializationOfObject io = new InitializationOfObject(); 
     InitializationOfObject io2 = new InitializationOfObject(45,65); 
     io.a = io2.a; 
     io.b = io2.b; 
     io.display(); 

     io.methodInitialization(34,56); 
     io.display(); 

     io.a = 12; 
     io.b = 24; 
     System.out.println("object initialization via refrence"); 
     System.out.println("a = "+io.a+" "+ " b ="+io.b); 
    } 

} 

objeto // initializatian por Construtor

k = 45m = 65 

objeto initializaion a través del método

k = 34m = 56 

objeto de inicialización a través referencia

a = 12 b =24 
+0

objeto por construtor k = 45m = 65 initializaion objeto a través del método k = 34 m = 56 inicialización objeto a través refrence a = 12 b = 24 – charu

Cuestiones relacionadas