Java复制构造函数未按预期工作
我正在学习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
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:-在遵循编程规则方面你是对的,但我是对的