java 高手们,菜鸟提问了?

2025-12-17 23:32:50
推荐回答(3个)
回答1:

id 是成员变量,不是“构造方法里的”,是对象的,就是“private int id;”这一句声明的。不同的方法里面的 id 都指向的是同一个变量,包括构造方法里的。声明只有一句,而其他都是赋值语句而已。

你指出的那一句
void info(){System.out.println("My Id is "+id);}
更无法说明是调用了哪一个构造方法的赋值语句。因为构造方法不是在这个时候调用的。
Person p = new Person();
Person p1 = new Person(400);
Person p2 = new Person(2,500);
这几句才调用了构造方法。你那句只是打印了对象所属的 id 而已。上面已经说过了,只有一个 id,不同方法里的 id 都是它。

Java 支持重载,包括构造方法的重载。Java 区别不同构造方法的办法就是看参数列表。调用构造器的时候就按照参数列表对号入座。

回答2:

这个程序可以看作是java里的多态!在new 一个类的时候如果不带参数,程序自然就会找到不带参数的构造方法,带一个参数,那么就自动会找到带一个参数的构造方法,两个么就自然会找到带两个参数的构造方法.

void info(){System.out.println("My Id is "+id);}
这里只是个方法,看谁去调用的,你在主函数里Person p = new Person();
p.info();这个p对象在构造的时候没有带参数,那么他调用的就是没带参数的构造方法。因此这个id=0;

private int age = 20;不用一开始就赋值,因为你构造方法里都有赋值的操作,就算不写程序会默认0的。

回答3:

p.info()代码的意思是:调用变量p引用对象的info方法,变量p在初始化的时候指向了一个Person对象,并且这个对象在初始化的时候使用的是默认的构造方法,即 id = 0; age = 25;
而后使用其他构造实例化的对象与p指向的对象互不干扰,因为这些对象存在于计算机堆内存的不同区域,所以调用p.info的方法不会因为p1和p2的初始化受到影响,另外private int age = 20;虽然变量age直接初始化了,但在Person对象实例化的时候age都被重新赋值了,所以不会影响这个程序的。