Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中直接初始化对象_Java_Object_Initialization - Fatal编程技术网

在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构造函数是可能的,但不像字符串那样,这是一种非常特殊的对象。通常,你会使用构造函数,但你不必 以下是构造函数版本:

是否可以像java中的字符串类那样直接初始化对象:

例如:

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