在java中直接初始化对象

问题描述 投票:0回答:11

是否可以像java中的String类一样直接初始化对象:

如:

String str="something...";

我想为我的自定义课程做同样的事情:

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

有可能吗

MyClass obj1={"name",24};

MyClass obj1="name",24;

初始化对象? 或者这怎么可能!

java object initialization
11个回答
60
投票

通常,您会使用构造函数,但您不必这样做!

这是构造函数版本:

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
}

这样使用:

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


但是,如果您的字段是

protected
public
(如您的示例所示),您可以在不定义构造函数的情况下完成此操作。这是java中最接近你想要的方式: // 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; } };

瞧!


14
投票

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; } }

您实际上可以创建一个新的 Person 对象并使用以下内容初始化其名字和姓氏:

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

当使用 Java 代码而不是 XML 配置定义 Spring 配置时,这经常被使用。


4
投票

示例:

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

然后在课堂上你想要这个:

myClass class = new myClass(24, "name");



3
投票

我知道构造函数,但是是否存在任何替代方法?

不,除了构造函数之外没有其他选择。

这基本上是该语言的基本保证之一。除了通过其构造函数之外,不能通过任何其他方式构造对象,并且除了通常的

new ConstructorName(...)

之外,没有其他语法。


我能想到的最接近的想法是有一个名为

mc

:

 的静态工厂方法

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

然后做

import static some.pkg.MyClass.mc; ... MyClass obj1 = mc("name",24);



0
投票


0
投票
然后你可以这样实例化你的类:

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



0
投票
//对象由构造函数初始化 

k = 45m = 65

通过方法初始化对象

k = 34m = 56

通过引用初始化对象

a = 12 b =24



0
投票

默认构造函数
  1. 参数化构造函数
  2. 您应该创建一个
参数化构造函数

来创建您的对象。


0
投票

因此,在调用 MyData 的类中,您将使用

Public MyData x = new MyData(); @PostConstruct public void init() { x.setName("Fering"); x.setAge(18); }

因此,一旦对象被信任,就会运行这些命令,这允许您在运行其他任何操作之前填充对象。

因此,您不必使用匿名子类,或创建新的构造函数,您只需获取该类,然后使用它的函数,然后再进行其他操作。


0
投票

Object [][] Tbl = { { 8, "Aberdeen", "USA", "GMT-06:00", 4416, 72659, 45.45556, -98.41333 }, { 9, "Aberdeen", "UK", "GMT+00:00", 229, 3091, 57.205, -2.20528 }, { 10, "Aberporth", "UK", "GMT+00:00", 246, 3502, 52.13944, -4.57111 }, { 11, "Abidjan", "Côte d'Ivoire", "GMT+00:00", 3867, 65578, 5.25, -3.93333 }, { 12, "Abilene", "USA", "GMT-06:00", 4328, 72266, 32.41667, -99.68333 }, /* ... */ { 5128, "Zyryanka", "Russia", "GMT+11:00", 1426, 25400, 65.73333, 150.9 }, };

上面的意思是初始化具有混合类型字段的类实例列表:

class Station { int id = -1; String name = null, country = null, timezone = null; long sta_code = -1, wmo_code = -1; double latitude = -90.1, longitude = 360.1; };

(OP仅要求单个实例)是的,通过添加一个使用类字段引用的可变参数构造函数,可以使用java反射轻松完成(省略任何错误检查):

private Field fields[] = this.getClass().getDeclaredFields(); Station(Object... args) { // fileds.length decremented by ond because we must skip // the last field (i.e., "Field fields[]" itself) for(int i = 0; i < fields.length-1; i++) try { fields[i].set(this, args[i]); } catch(Exception e) { e.printStackTrace(); } }

之后,只需添加以下几行

ArrayList<Station> stList = new ArrayList(); for(Object[] array : Tbl) stList.add(new Station(array));

并根据需要使用该列表。例如,可以添加像
这样的方法

void print() { String s = ""; try { for(int i = 0; i < fields.length-1; i++) s += fields[i].getName() + "=" + fields[i].get(this) + " "; } catch(Exception e) { e.printStackTrace(); } System.out.println(s); }

输出创建的列表:

for (Station st : stList) st.print();

并得到

id=8 name=Aberdeen country=USA timezone=GMT-06:00 sta_code=4416 wmo_code=72659 latitude=45.45556 longitude=-98.41333 id=9 name=Aberdeen country=UK timezone=GMT+00:00 sta_code=229 wmo_code=3091 latitude=57.205 longitude=-2.20528 id=10 name=Aberporth country=UK timezone=GMT+00:00 sta_code=246 wmo_code=3502 latitude=52.13944 longitude=-4.57111 id=11 name=Abidjan country=Côte d'Ivoire timezone=GMT+00:00 sta_code=3867 wmo_code=65578 latitude=5.25 longitude=-3.93333 id=12 name=Abilene country=USA timezone=GMT-06:00 sta_code=4328 wmo_code=72266 latitude=32.41667 longitude=-99.68333 ... id=5128 name=Zyryanka country=Russia timezone=GMT+11:00 sta_code=1426 wmo_code=25400 latitude=65.73333 longitude=150.9

当然,这一切仅用于测试目的,很难推荐在最终代码中使用。


-1
投票

字符串str =“某事”

你可以用这种方式初始化字符串,因为字符串在java中是一个文字。只有文字才能以这种方式初始化。复合对象无法初始化,只能使用构造函数和 new 运算符进行实例化。

© www.soinside.com 2019 - 2024. All rights reserved.