是否可以像java中的String类一样直接初始化对象:
如:
String str="something...";
我想为我的自定义课程做同样的事情:
class MyData{
public String name;
public int age;
}
有可能吗
MyClass obj1={"name",24};
或
MyClass obj1="name",24;
初始化对象? 或者这怎么可能!
通常,您会使用构造函数,但您不必这样做!
这是构造函数版本:
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;
}
};
瞧!
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 配置时,这经常被使用。
示例:
public myClass( int age, String name)
{
this.age = age;
this.name = name;
}
然后在课堂上你想要这个:
myClass class = new myClass(24, "name");
我知道构造函数,但是是否存在任何替代方法?
不,除了构造函数之外没有其他选择。
这基本上是该语言的基本保证之一。除了通过其构造函数之外,不能通过任何其他方式构造对象,并且除了通常的
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);
然后你可以这样实例化你的类:
MyData myData = new MyData("name", 24);
//对象由构造函数初始化
k = 45m = 65
通过方法初始化对象
k = 34m = 56
通过引用初始化对象
a = 12 b =24
因此,在调用 MyData 的类中,您将使用
Public MyData x = new MyData();
@PostConstruct public void init() {
x.setName("Fering");
x.setAge(18);
}
因此,一旦对象被信任,就会运行这些命令,这允许您在运行其他任何操作之前填充对象。
因此,您不必使用匿名子类,或创建新的构造函数,您只需获取该类,然后使用它的函数,然后再进行其他操作。
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
当然,这一切仅用于测试目的,很难推荐在最终代码中使用。
字符串str =“某事”
你可以用这种方式初始化字符串,因为字符串在java中是一个文字。只有文字才能以这种方式初始化。复合对象无法初始化,只能使用构造函数和 new 运算符进行实例化。