Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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_Copy Constructor - Fatal编程技术网

Java复制构造函数未按预期工作

Java复制构造函数未按预期工作,java,copy-constructor,Java,Copy Constructor,我正在学习Java,最近学习了复制构造函数教程。我试图编写复制构造函数代码,但它会给出意外的输出 问题是: 为什么第一个输出显示0和null值 以下是具有复制构造函数的对象: class student6 { int id; String name; int i; String n; student6(int a, String b) { id = a; name = b; } student6(stu

我正在学习Java,最近学习了复制构造函数教程。我试图编写复制构造函数代码,但它会给出意外的输出

问题是:

为什么第一个输出显示
0
null

以下是具有复制构造函数的对象:

class student6 {

    int id;
    String name;
    int i;
    String n;

    student6(int a, String b) {
        id = a;
        name = b;
    }

    student6(student6 s) {
        i = s.id;
        n = s.name;
    }

    void display() {
        System.out.println(i + "..." + n);
    }

    public static void main(String args[]) {
        student6 s1 = new student6(11, "Suresh");
        student6 s2 = new student6(s1);

        s1.display();
        s2.display();
    }
}
输出

0…空

11…Suresh


在第一个构造函数中,设置字段
id
name
,第二个构造函数设置字段
i
n

两次打印时,您都会打印未为第一个对象设置的
i
n
值,因此它们分别为
0
null

这里有一个修改,我相信您会期望得到输出

class student6 {

    int id;
    String name;

    student6(int a, String b) {
        id = a;
        name = b;
    }

    student6(student6 s) {
        id = s.id;
        name = s.name;
    }

    void display() {
        System.out.println(id + "..." + name);
    }

    public static void main(String args[]) {
        student6 s1 = new student6(11, "Suresh");
        student6 s2 = new student6(s1);

        s1.display();
        s2.display();
    }
}

在第一个构造函数中,设置字段
id
name
,第二个构造函数设置字段
i
n

两次打印时,您都会打印未为第一个对象设置的
i
n
值,因此它们分别为
0
null

这里有一个修改,我相信您会期望得到输出

class student6 {

    int id;
    String name;

    student6(int a, String b) {
        id = a;
        name = b;
    }

    student6(student6 s) {
        id = s.id;
        name = s.name;
    }

    void display() {
        System.out.println(id + "..." + name);
    }

    public static void main(String args[]) {
        student6 s1 = new student6(11, "Suresh");
        student6 s2 = new student6(s1);

        s1.display();
        s2.display();
    }
}

s1
仅初始化
int-id
字符串名称:这一行

student6 s1 = new student6(11, "Suresh");
调用第一个构造函数

student6(int a, String b) {
    id = a;
    name = b;
}
那么,打电话

System.out.println(i + "..." + n);

将打印
i
n
s1
的默认值,仅初始化
int-id
字符串名称:这一行

student6 s1 = new student6(11, "Suresh");
调用第一个构造函数

student6(int a, String b) {
    id = a;
    name = b;
}
那么,打电话

System.out.println(i + "..." + n);

将打印
i
n

的默认值。您必须更改从

student6(student6 s)
{
i=s.id;
n=s.name;
}

在显示方法中,您正在打印
id
name
。因此,只有初始化它们才能看到结果

请遵循。类名以大写字母开头<代码>学生6
应该是
student6


谢谢你打印我的名字;)

复制构造函数逻辑时必须更改

student6(student6 s)
{
i=s.id;
n=s.name;
}

在显示方法中,您正在打印
id
name
。因此,只有初始化它们才能看到结果

请遵循。类名以大写字母开头<代码>学生6
应该是
student6



谢谢你打印我的名字;)

为什么有
i
n
字段?您希望如何处理它们?仅供参考,Java中没有“复制构造函数”。在C++中,复制构造函数具有特定的ARG签名,编译器可以将其识别为特殊的。在某些情况下(例如,当通过值将对象传递给函数时),编译器向复制构造函数发出隐式调用Java中不会发生类似的情况,因为Java变量永远不能保存对象:
Foo a始终是对对象的引用,无论您在何处看到它。您编写的构造函数可以像C++复制构造函数一样工作,但是java编译器对它的处理与其他构造函数不同。谢谢。是的,没错。C++有复制构造函数,但java没有。在这里,我只是“尝试”从这个程序中获取复制构造函数类型的响应。@JonSkeet:-我尝试获取id和name值(由student6 s1=new student6(11,“Suresh”)设置)在i和n字段中。这实际上不是关于构造函数的,而是关于一般的字段。为什么有
i
n
字段?您希望如何处理它们?仅供参考,Java中没有“复制构造函数”。在C++中,复制构造函数具有特定的ARG签名,编译器可以将其识别为特殊的。在某些情况下(例如,当通过值将对象传递给函数时),编译器向复制构造函数发出隐式调用Java中不会发生类似的情况,因为Java变量永远不能保存对象:
Foo a始终是对对象的引用,无论您在何处看到它。您编写的构造函数可以像C++复制构造函数一样工作,但是java编译器对它的处理与其他构造函数不同。谢谢。是的,没错。C++有复制构造函数,但java没有。在这里,我只是“尝试”从这个程序中获取复制构造函数类型的响应。@JonSkeet:-我尝试获取id和name值(由student6 s1=new student6(11,“Suresh”)设置)在i和n字段中。这实际上不是关于构造函数的,而是关于一般的字段。从第一个构造函数开始,当'id'和'name'都被设置时,为什么不从第二个构造函数将值提供给'i'和'n'。或者是否有任何方法可以通过这种方式获取“i”和“n”。从第一个构造函数开始,当“id”和“name”都设置好时,为什么不从第二个构造函数向“i”和“n”提供值。或者有没有办法得到“i”和“n”的填充结果。@Suresh,我同意你提供的逻辑和修改过的代码。它按预期工作。我只是想知道为什么'I'和'n'不能有相同的值(当值由构造函数赋值时),就像
id
name
@Aaditya看到了,它们被赋值了。但您没有在显示方法中打印它们。您正在分配变量
i
n
并打印
id
name
@Suresh:-得到了答案,只有将所有变量设为静态变量才能获得预期的输出:-static int id;静态字符串名;静态int-i;静态字符串n;因此,所有的价值观都将保持,输出将如预期的那样。不,你做错了。实例不应与静态混合使用。@Suresh:-在遵循编程规则方面你是对的,但我是对的