在java中直接初始化对象
是否可以像java中的字符串类那样直接初始化对象: 例如:在java中直接初始化对象,java,object,initialization,Java,Object,Initialization,是否可以像java中的字符串类那样直接初始化对象: 例如: String str="something..."; 我想对我的自定义类执行相同的操作: class MyData{ public String name; public int age; } 有可能吗 MyClass obj1={"name",24}; 或 初始化对象? 或者这是怎么可能的 关键字new和using构造函数是可能的,但不像字符串那样,这是一种非常特殊的对象。通常,你会使用构造函数,但你不必 以下是构造函数版本:
String str="something...";
我想对我的自定义类执行相同的操作:
class MyData{
public String name;
public int age;
}
有可能吗
MyClass obj1={"name",24};
或
初始化对象?
或者这是怎么可能的 关键字new和using构造函数是可能的,但不像字符串那样,这是一种非常特殊的对象。通常,你会使用构造函数,但你不必 以下是构造函数版本:
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);
但是,如果您的字段受
保护
或公共
,如您的示例所示,则可以在不定义构造函数的情况下执行此操作。这是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 myClass( int age, String name)
{
this.age = age;
this.name = name;
}
然后在课堂上,你想要这个:
myClass class = new myClass(24, "name");
然后可以通过以下方式实例化类:
MyData myData = new MyData("name", 24);
我知道,对于构造函数,是否存在其他方法?
不,除了构造器,没有其他选择
这基本上是语言的基本保证之一。一个对象只能通过其构造函数来构造,并且没有比通常的新构造函数名(…)
更好的语法
我能想到的最接近的想法是有一个静态工厂方法,叫做,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);
在对象初始化期间,java中除了构造函数(以及新操作符)之外没有其他选择。你提到了 String str=“某物”
您可以这样初始化字符串,因为字符串在java中是一个文本。只有文本才能以这种方式初始化。复合对象不能初始化,只能用构造函数的新操作符实例化 如果您有班级人员:
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对象,并使用以下命令初始化其firstName和lastName:
Person person = new Person(){{
setFirstName("My FirstName");
setLastName("MyLastName");
}}
在使用Java代码而不是XML配置定义Spring配置时,经常使用这种方法
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);
}
}
//由构造函数初始化对象
k = 45m = 65
通过方法初始化对象
k = 34m = 56
通过引用进行对象初始化
a = 12 b =24
java中有两种类型的构造函数
您应该创建一个用于创建对象的 以下内容符合您的要求,但不是您所期望的方式 因此,在调用MyData的类中,可以使用
Public MyData x=new MyData();
@构造后公共void init(){
x、 设置名称(“Fering”);
x、 设置(18);
}
因此,一旦构建了对象,就会运行这些命令,这允许您在运行任何其他命令之前填充对象
因此,您不必使用匿名子类,也不必创建新的构造函数,您只需先获取该类,然后使用其函数,就可以了。像为对象创建构造函数一样?嗯,也许您需要这样:)我知道有了构造函数,但有没有其他方法?不,您不能,这用于将值作为数组分配给特定对象。您可以根据自己的要求创建重载构造函数C#有这个功能,希望Java也有。如何:使用对象初始值设定项初始化对象(C#编程指南)-我的问题是:MyClass obj1={“name”,24};那么答案是不,你不能!你能告诉我字符串类的工作原理吗,它是如何做到的!,因此,我有了一些实现的想法来解决我的问题。老实说,我不确定内部实现,但是它是不同的,因为每当您使用myString=“aString”而不是myString=new String(“aString”)创建字符串文字时,只有当且仅当它不在Java字符串池中时,才会分配一个新字符串。这个Java字符串池包含到目前为止已经创建的所有字符串文本,所以它只是从池中引用它们,而不是每次都创建一个新的字符串对象。不起作用。如果定义了
MyData(字符串名,int-age)
构造函数,则没有任何MyData()
构造函数。编辑:嗯。。我可能误解了这里的意思。你是建议完全删除构造函数?@aioobe你一定是在开玩笑。。。我假设人们实际上会把“没有构造函数”理解为“没有构造函数”。。ie“定义没有构造函数的类”。jeezI将其解读为“您可以通过使用匿名子类构造MyData
对象,而无需使用其构造函数”。从你的第一个片段来看,我觉得它不管用。(此外,您仍然在使用构造函数。我坚持我的观点:没有办法解决这个问题。)我对新类的初始化似乎不熟悉,因此我发现它被称为双括号初始化。因此,它基本上是一个实例初始化块,是匿名内部类的一部分。@user875298您的描述是准确的,但“双大括号初始化”是一个不好的名字:java的语法通常会导致两个相邻的大括号,但在没有这个大括号的情况下也可以这样做(例如,如果您声明了一个实例变量或方法)您仍然在经历一个构造函数(因此必须编写新的ConstructorName
,这是我认为OP想要避免的)。警告:这样做实际上是在创建一个匿名内部类,而不仅仅是初始化一个对象。有关某些潜在陷阱的解释,请参见。对象初始化由construtor k=45m=65对象初始化通过方法k=34m=56对象初始化通过引用a=12 b=24
k = 34m = 56
a = 12 b =24